ethereum开发环境搭建

ethereum开发环境搭建

准备工作

  • 安装git
  • 安装go开发环境安装
  • 下载go-ethereum源码

编译运行

进入go-ethereum根目录,执行make编译

1
2
3
cd go-ethereum
make
build/bin/geth

接下来,看看编译出来的内容:

1
2
3
4
5
6
7
8
9
10
11
12
abigen #源码生产工具,将智能合约转化成go package
bootnode #启动一个仅仅实现网络发现的节点
ethkey
evm #以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境
examples #提供一些事例程序
faucet
geth #以太坊命令行客户端,最重要的一个工具
p2psim #提供了一个工具来模拟http的API
puppeth #创建一个新的以太坊网络的向导
rlpdump #提供了一个RLP数据的格式化输出
swarm #swarm网络的接入点
wnode #这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的
Comentarios

聊天产品设计

聊天产品设计

产品功能

会话列表

  • 创建会话

  • 删除会话

  • 获取会话列表

聊天消息

  • 获取消息列表

  • 发消息

  • 删除消息

  • 撤回消息

  • 清空聊天记录

红点

  • 未读消息数

API设计

会话

  • 获取会话分页列表

GET /users/me/conversations?with=users,questions,messages,questions,stickers&since=2018-06-12T09:05:28.501716&limit=20

消息

  • 获取消息列表

GET /users/me/conversations/3916/messages?limit=60&since=1799981794091663834&with=stickers&questions&users&moments

  • 发消息

POST /users/me/conversations/3916/messages

1
2
3
{
"value": "额呃呃呃"
}
  • 撤回消息

PATCH /users/me/conversations/3916/messages/1799987543769416155?method=patch

1
2
3
{
"recalled": true
}
  • 消息置为已读

PATCH /users/me/conversations/381?method=patch

1
{"readUntil":"1800042790965510188"}
  • 清空聊天记录

DELETE /users/me/conversations/3916/messages?method=delete&until=1799987543769416155

Comentarios

IPFS

IPFS

1 介绍

​ 在互联网的发展过程中,人们一直试图构建一个全球的分布式文件系统。有成功的,也有失败的。在这几十年的尝试过程中,也就AFS取得了成功,并且今天仍然被使用。在学院派之外,取得巨大成功的是共享大文件的系统,比如,Napster、KaZaA以及BitTorrent。然而,这些系统都不能作为基础设施,在其上构建应用。

​ 到目前为止,HTTP可能是最成功的“分布式的文件系统”。HTTP配合浏览器已经成为当前最主流的架构。但是,我们正在进入一个新的数据的时代,将面临如下问题:

  1. 数据将进入PB时代,
  2. 在超大数据集上进行跨组织的计算
  3. 高容量实时或者按需的媒体数据流
  4. 大量数据集的版本化
  5. 保证重要数据安全、不丢失

总结成一句话就是“海量数据,时时可达”。考虑到这些苛刻的条件以及带宽的因素,我们已经放弃使用HTTP。

​ Git作为分布式的源码版本控制系统,发明了很多有用的数据建模和操作的方式。Git工具链提供了很多大型分布式文件系统都缺少的版本化的功能。Camlistore、Dat都是受到Git的启发开发出来的分布式文件系统。Git的设计思想已经深深影响了分布式文件系统的设计。Merkle DAG数据模型具有很强的内容变大能力。

​ 在接下来的部分,将介绍一种神奇的P2P版本控制的文件系统IPFS,IPFS汲取过去成功的系统设计思想,试图解决上面提到的问题。IPFS的核心思想是将所有的数据按照Merkle DAG进行建模。

2 背景知识

2.1 DHTs

​ DHTs被用来维护P2P系统中的元数据信息。例如,BitTorrent MainlineDHT记录了P2P网络中的节点信息。

2.1.1 Kademlia DHT

Kademlia是一种广泛使用的DHT,它有如下特性:

  1. log(n)的查找时间复杂度
  2. 节点之间协调成本很低
  3. 优先选择长时间在线的节点,能有效的抵御攻击
  4. 经历过大量的系统实践

2.1.2 Coral DSHT

有很多的P2P系统将数据块直接存储在DHT上,浪费大量的存储空间和带宽。Coral DSHT在如下三个方面扩展了Kademlia:

  1. Kademlia在value节点中存储最近的N个结点信息。这种方式没有考虑数据的局部性原理,不管远端结点是否已经存储了相关数据,都强制最近的结点存储一些对本结点无用的数据,会浪费存储空间和带宽。与之相对的,Coral存储能提供相关数据的结点信息。
  2. Coral可以只将部分的数据放到附近的结点中,避免热点。
  3. Coral将DHT表按照区域、大小分层管理。这样可以优先查询同一个区域内的结点。

2.2 BitTorrent

BitTorrent是目前被广泛使用的P2P文件共享系统,它成功的协调成千上万的互相不信任的分布式结点共享文件的片段。IPFS借鉴了BitTorrent如下几个方面:

  1. BitTorrent的数据交换协议使用tit-for-tat的策略,即对共享数据资源的结点进行奖赏,对只获取资源不共享资源的结点进行惩罚。
  2. BitTorrent结点记录着可供使用的文件片段信息,优先发送稀有的文件片段。
Comentarios

2018-05-27-a-provably-secure-proof-of-stake-blockchain-protocol.md

Ouroboros: 一种安全的POS区块链协议

介绍

Comentarios

2018-04-17-markdown-toturial.md

欢迎使用马克飞象

@(示例笔记本)[马克飞象|帮助|Markdown]

马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同步功能,带来前所未有的书写体验。特点概述:

  • 功能丰富 :支持高亮代码块、LaTeX 公式、流程图,本地图片以及附件上传,甚至截图粘贴,工作学习好帮手;
  • 得心应手 :简洁高效的编辑器,提供桌面客户端以及离线Chrome App,支持移动端 Web;
  • 深度整合 :支持选择笔记本和添加标签,支持从印象笔记跳转编辑,轻松管理。

[TOC]

Markdown简介

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— 维基百科

正如您在阅读的这份文档,它使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接或一个脚注[^demo]。下面列举了几个高级功能,更多语法请按Ctrl + /查看帮助。

代码块

1
2
3
4
5
6
7
8
9
10
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''

LaTeX 公式

可以创建行内公式,例如 $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$。或者块级公式:

$$ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$

表格

Item Value Qty
Computer 1600 USD 5
Phone 12 USD 12
Pipe 1 USD 234

流程图

1
2
3
4
5
6
7
8
st=>start: Start
e=>end
op=>operation: My Operation
cond=>condition: Yes or No?
st->op->cond
cond(yes)->e
cond(no)->op

以及时序图:

1
2
3
Alice->Bob: Hello Bob, how are you?
Note right of Bob: Bob thinks
Bob-->Alice: I am good thanks!

提示:想了解更多,请查看流程图语法以及时序图语法

复选框

使用 - [ ]- [x] 语法可以创建复选框,实现 todo-list 等功能。例如:

  • 已完成事项
  • 待办事项1
  • 待办事项2

注意:目前支持尚不完全,在印象笔记中勾选复选框是无效、不能同步的,所以必须在马克飞象中修改 Markdown 原文才可生效。下个版本将会全面支持。

印象笔记相关

笔记本和标签

马克飞象增加了@(笔记本)[标签A|标签B]语法, 以选择笔记本和添加标签。 绑定账号后, 输入(自动会出现笔记本列表,请从中选择。

笔记标题

马克飞象会自动使用文档内出现的第一个标题作为笔记标题。例如本文,就是第一行的 欢迎使用马克飞象

快捷编辑

保存在印象笔记中的笔记,右上角会有一个红色的编辑按钮,点击后会回到马克飞象中打开并编辑该笔记。

注意:目前用户在印象笔记中单方面做的任何修改,马克飞象是无法自动感知和更新的。所以请务必回到马克飞象编辑。

数据同步

马克飞象通过将Markdown原文以隐藏内容保存在笔记中的精妙设计,实现了对Markdown的存储和再次编辑。既解决了其他产品只是单向导出HTML的单薄,又规避了服务端存储Markdown带来的隐私安全问题。这样,服务端仅作为对印象笔记 API调用和数据转换之用。

隐私声明:用户所有的笔记数据,均保存在印象笔记中。马克飞象不存储用户的任何笔记数据。

离线存储

马克飞象使用浏览器离线存储将内容实时保存在本地,不必担心网络断掉或浏览器崩溃。为了节省空间和避免冲突,已同步至印象笔记并且不再修改的笔记将删除部分本地缓存,不过依然可以随时通过文档管理打开。

注意:虽然浏览器存储大部分时候都比较可靠,但印象笔记作为专业云存储,更值得信赖。以防万一,请务必经常及时同步到印象笔记

编辑器相关

设置

右侧系统菜单(快捷键Ctrl + M)的设置中,提供了界面字体、字号、自定义CSS、vim/emacs 键盘模式等高级选项。

快捷键

帮助 Ctrl + /
同步文档 Ctrl + S
创建文档 Ctrl + Alt + N
最大化编辑器 Ctrl + Enter
预览文档 Ctrl + Alt + Enter
文档管理 Ctrl + O
系统菜单 Ctrl + M

加粗 Ctrl + B
插入图片 Ctrl + G
插入链接 Ctrl + L
提升标题 Ctrl + H

关于收费

马克飞象为新用户提供 10 天的试用期,试用期过后需要续费才能继续使用。未购买或者未及时续费,将不能同步新的笔记。之前保存过的笔记依然可以编辑。

反馈与建议


感谢阅读这份帮助文档。请点击右上角,绑定印象笔记账号,开启全新的记录与分享体验吧。

[^demo]: 这是一个示例脚注。请查阅 MultiMarkdown 文档 关于脚注的说明。 限制: 印象笔记的笔记内容使用 ENML 格式,基于 HTML,但是不支持某些标签和属性,例如id,这就导致脚注TOC无法正常点击。

Comentarios

Best Time to Buy and Sell Stock IV

Description

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Recursion formula

Recursion code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func maxProfit(k int, prices []int) int {
if k == 0 {
return 0
}
if len(prices) == 0 || len(prices) == 1 {
return 0
}
tmpMax := 0
for i := 0; i < len(prices) - 1; i ++ {
tmpMax = max(tmpMax, maxProfit(k-1, prices[:i]) + prices[len(prices)-1] - prices[i]
}
}
return max(maxProfit(k, prices[:len(prices)-1]), tmpMax)
}
func max(a int, b int) int {
if a >= b {
return a
} else {
return b
}
}

A little optimize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func maxProfit(k int, prices []int) int {
if k == 0 {
return 0
}
if len(prices) == 0 || len(prices) == 1 {
return 0
}
tmpMax := 0
for i := 0; i < len(prices) - 1; i ++ {
if prices[len(prices)-1] > prices[i] {
tmpMax = max(tmpMax, maxProfit(k-1, prices[:i]) + prices[len(prices)-1] - prices[i])
}
}
return max(maxProfit(k, prices[:len(prices)-1]), tmpMax)
}
func max(a int, b int) int {
if a >= b {
return a
} else {
return b
}
}

Non recursion solution

1
2
Comentarios

tcpflow的简单用法

问题

作为一个基层的后端工程师,经常会被各式各样的人丢各种各样的bug,但是,他们通常只会说相同的一句话,怎么又出错了,快去查一下。然后,就把一口大锅摔到你的头上,拍拍手就走了。这时你的心里肯定有一万只草泥马呼啸而过,难道不能再多提供一些信息嘛。但是,你面对的可能是老板,可能是屁也不懂的产品,他们唯一能告诉你的就是他们自己的帐号信息。

这个时候,你只能登录上服务器,查看日志信息。但是,你惊奇的发现,写这个服务的码农,竟然从未输出过任何日志。真是晴天霹雳呀,幸好还有tcpflow,tcpdump这两大法宝,这次介绍如何使用tcpflow抓包查看请求的数据,以及返回的结果。

tcpflow

tcpflow是服务器上经常使用的一个小程序,它能够捕获tcp的数据流,并将其存储为方便分析和调试的格式。每一条tcp流都会被存储到独立的文件中,因此,典型的tcp流将会被分别存储为进、出两个文件。

tcpflow和tcpdump比较相似,它们都能处理来自实时或者存储到文件中的数据包。不同点是,tcpflow会重新构建真实的数据流,并且会分开存储。

虽然tcp数据包存在重传和乱序的情况,tcpflow能够按照正常的顺序重建数据流。1.0版本支持VLAN多路复用,但是,当前不支持IP fragmentation,数据流中如果存在IP fragments,不能被正常的处理。

tcpflow基于LBL Packet Capture Library,支持丰富的过滤条件。

安装

centos上使用yum安装

1
yum install tcpflow

简单使用

  • 一个简单的例子
1
tcpflow -cp -i eth0 port 18223

-c:将数据流打印到控制台,不要存储到文件中。

-p:非杂乱模式

-i:指定网络接口

port:指定监听的端口号

简单的说,将端口号18223的tcp流打印到控制台输出。

  • 只关心输入数据流
1
tcpflow -cp -i eth0 dst port 18223

dst:18223是tcp数据流的目的端口

  • 只关心输出流量
1
tcpflow -cp -i eth0 src port 18223

src:18223是tcp数据流的源端口

Comentarios

minikube系列(一):hello minikube

1
minikube start --vm-driver=xhyve --docker-env HTTP_PROXY=http://proxy.p1staff.com:1337 --docker-env HTTPS_PROXY=http://proxy.p1staff.com:1337
Comentarios

2017-10-31-docker-practice-manage-data-4-tmpfs.md

Comentarios

docker管理数据(三):mounts

Comentarios