汪晓明对区块链、以太坊的思考

记录创业、生活的所思所感,探讨去中心化思想,推动区块链的发展。

我推出了《VIP区块链技术开发视频》和电子书《深入浅出以太坊》

以太坊连载(16):公有链、联盟链、私有链及网络配置介绍

以太坊网络

去中心化共识的基础是参与节点的点对点网络,节点维护并保证区块链网络的安全。参见挖矿。

以太坊网络数据统计

EthStats.net是以太坊网络实时数据的仪表板,这个仪表板展示重要信息,诸如现在的区块,散表难度,gas价格和gas花费等。页面上显示的节点只是精选了网络上的实际节点。任何人都可以在EthStats仪表板上添加他们的节点。Github上的Eth-Netstats README描述了如何连接。

EtherNodes.com展示了节点数的当前和历史数据以及以太坊主网络和Morden测试网络上的其他信息。

当前实时网络上客户端实现分配 – EtherChain上的实时数据。

公有链、私有链和联盟链

当今大多数以太坊项目都依靠以太坊作为公有链,公有链可以访问到更多用户,网络节点,货币和市场。然而通常有理由更偏好私有链或联盟链(在一群值得信任的参与者中)。例如,银行领域的很多公司都希望以太坊作为他们私有链的平台。

以下是博客发文《关于公有链和私有链》的摘录,它解释了三种区块链在许可方面的区别:

  • 公有链:世界上所有人都可以阅读和发送交易。如果他们合法都有希望看到自己被包括在内。世界上任何人都能参与到共识形成过程——决定在链条上添加什么区块以及现状是怎样的。作为中心化或准中心化信任的替代品,公有链受加密经济的保护,加密经济是经济激励和加密图形验证的结合,用类似工作量证明或权益证明的机制,遵循的总原则是人们影响共识形成的程度和他们能够影响的经济资源数量成正比。这类区块链通常被认为是“完全去中心化“。

  • 联盟链:共识形成过程由预先选择的一系列的节点所掌控,例如,设想一个有15个金融机构的团体,每个机构都操作一个节点,为了使区块生效,其中的10个必须签署那个区块。阅读区块链的权利可能是公开的,或仅限于参与者,也有混合的路径,比如区块的根散表和应用程序编程接口一起公开,使公共成员可以进行一定量的查询,重获一部分区块链状态的加密图形证明。这类区块链被认为是“部分去中心化”。

  • 私有链:书写许可对一个组织保持中心化。阅读许可可能是公开的或者限制在任意程度。应用很可能包含对单个公司内部的数据库管理,审查等,因此公共的可读性在很多情况下根本不必要,但在另一些情况下人们又想要公共可读性。

私有链/联盟链可能和公有链毫无联系,他们仍然通过投资以太坊软件开发,对以太坊整体生态系统有利。经过一段时间,这会转变成软件改善,知识共享和工作机会。

如何连接

Geth会持续尝试在网络上连接到其他节点,直到有了端点为止。如果你在路由器上有可用的UPnP或者在面向因特网的服务器上运行以太坊,它也会接受其他节点的连接。

Geth通过发现协议找到对等端。在发现协议中,节点互相闲聊发现网络上的其他节点。最开始,geth会使用一系列辅助程序节点,这些辅助程序节点的端点记录在源代码中。

检查连接和ENODE身份

要检查客户端在交互控制台上连接了多少对等端点,net模块有两个属性可以提供信息,告诉你对等端点的数量以及你是否在监听的节点。

1
2
3
4
> net.listening
true
> net.peerCount
4

了解更多关于连接对等端点的信息,比如IP地址、端口号和支持协议,用管理员对象的peers()功能。admin.peers()会返回到现在已连接的对等端点列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
> admin.peers
[{
ID: 'a4de274d3a159e10c2c9a68c326511236381b84c9ec52e72ad732eb0b2b1a2277938f78593cdbe734e6002bf23114d434a085d260514ab336d4acdc312db671b',
Name: 'Geth/v0.9.14/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '5.9.150.40:30301',
LocalAddress: '192.168.0.28:39219'
}, {
ID: 'a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c',
Name: 'Geth/v0.9.15/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '52.16.188.185:30303',
LocalAddress: '192.168.0.28:50995'
}, {
ID: 'f6ba1f1d9241d48138136ccf5baa6c2c8b008435a1c2bd009ca52fb8edbbc991eba36376beaee9d45f16d5dcbf2ed0bc23006c505d57ffcf70921bd94aa7a172',
Name: 'pyethapp_dd52/v0.9.13/linux2/py2.7.9',
Caps: 'eth/60, p2p/3',
RemoteAddress: '144.76.62.101:30303',
LocalAddress: '192.168.0.28:40454'
}, {
ID: 'f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0',
Name: '++eth/Zeppelin/Rascal/v0.9.14/Release/Darwin/clang/int',
Caps: 'eth/60, shh/2',
RemoteAddress: '129.16.191.64:30303',
LocalAddress: '192.168.0.28:39705'
} ]

要检查geth使用的端口,发现你自己的enode URI 执行:

1
2
3
4
5
6
7
8
9
10
11
> admin.nodeInfo
{
Name: 'Geth/v0.9.14/darwin/go1.4.2',
NodeUrl: 'enode://3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694@[::]:30303',
NodeID: '3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694',
IP: '::',
DiscPort: 30303,
TCPPort: 30303,
Td: '2044952618444',
ListenAddr: '[::]:30303'
}

更快下载区块链

启动以太坊客户端时,会自动下载以太坊区块链。用于下载以太坊区块链的时间会根据客户端、客户端设置、连接速度和可用的端点数量变化。下面是更快获取以太坊区块链的一些选项。

使用geth

如果你在用geth客户端,你可以做些什么来加速下载以太坊区块的时间。如果你用—fast标志来执行以太坊快速同步,不会保留过去的交易数据。

注意:你不能在执行所有或者部分正常的同步操作之后再使用这个标志,也就是说在用这个指令之前,不能下载以太坊区块链的任何部分。查看这个Ethereum Stack.Exchange answer了解更多。

下面是想要更快同步客户端时使用的一些标志。

—fast

这个标志使通过状态下载而不是下载整个区块数据来实现快速同步成为可能。这样也能大幅减少区块链尺寸。注意:—fast只在从头开始同步区块链,并且是出于安全原因第一次下载区块链时,才会运行。查看Reddit发文了解更多。

—cache=1024

分配到内部缓存的千兆内存(最少 16MB / 数据库)。默认是16MB,所以根据你电脑内存多少,增加到256, 512, 1024 (1GB)或者2048 (2GB)会带来不同。

—jitvm 这个标志可以激活JIT VM。

完整的控制台命令示例:

1
geth --fast --cache=1024 --jitvm console

了解更多关于快速同步和区块链下载次数的讨论,查看这篇Reddit发文。

导出/导入区块链

如果你已经同步了整个以太坊节点,可以从完全同步的节点中导出区块链数据并将其导入新节点。你可以在geth中用geth export filename指令导出所有节点,并用geth import filename将区块链导入节点,来实现这一目的。

静态节点,信任节点和启动节点

Geth支持一个叫静态节点的特征,如果你有特定的端点,你会一直想与静态节点连接。如果断开连接,静态节点会再次连接。你可以配置永久性静态节点,方法是将如下所说的放进/static-nodes.json(这应该是和chaindata以及keystone在同一个文件夹)

1
2
3
4
[
"enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",
"enode://pubkey@ip:port"
]

你也可以在运行期间通过Javascript使用admin.addPeer()加入静态节点。

1
> admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae

连接的常见问题

有时候可能无法连接,最常见的原因有:

  • 本地时间不正确。要参与到以太坊网络中,需要精确的时钟。检查OS如何同步时钟(例如sudo ntpdate -s time.nist.gov),即便只快了12秒也有可能导致0端点。
  • 有的防火墙配置可能会阻止UDP流通。可以用静态节点功能或者控制台上的admin.addPeer() 来手动配置连接。

不使用发现协议来启动geth,你可以用—nodiscover参数。你只会在运行测试节点或有固定节点的实验测试网络时才想要这样做。

下一篇文章我们将会介绍《以太坊连载(17):搭建私有链和测试网络》

感谢朝夕团队Azure, Bob参与《Ethereum Homestead Documentation》的翻译和校验。