第四章 公有链、联盟链、私有链和网络
4.1 以太坊网络
去中心化共识的基础是参与节点的点对点网络,节点维持和保护着区块链(维护并保证区块链网络的安全)。参见挖矿。
以太坊网络数据
EthStats.net是以太坊网络实时数据的仪表板,这个仪表板展示重要信息,诸如现在的区块,散表难度,gas价格和 gas花费等。页面上显示的节点只是精选了网络上的实际节点。任何人都可以在 EthStats仪表板上添加他们的节点。Github上的 Eth-Netstats README描述了如何连接。
EtherNodes.com展示了节点数的当前和历史数据以及以太坊主网络和 Morden测试网络上的其他信息。
当前实时网络上客户端实现分配 –EtherChain上的实时数据。
4.2 公有链、私有链和联盟链
当今大多数以太坊项目都依靠以太坊作为公有链,公有链可以访问到更多用户,网络节点,货币和市场。然而通常有理由更偏好私有链或联盟链(在一群值得信任的参与者中)。例如,银行领域的很多公司都希望以太坊作为他们私有链的平台。
以下是博客发文《关于公有链和私有链》的摘录,它解释了三种区块链在许可方面的区别:
- 公有链:世界上所有人都可以阅读和发送交易。如果他们合法都有希望看到自己被包括在内。世界上任何人都能参与到共识形成过程——决定在链条上添加什么区块以及现状是怎样的。作为中心化或准中心化信任的替代品,公有链受加密经济的保护,加密经济是经济激励和加密图形验证的结合,用类似工作量证明或
权益证明的机制,遵循的总原则是人们影响共识形成的程度和他们能够影响的经济资源数量成正比。这类区块链通常被认为是“完全去中心化“。
- 联盟链:共识形成过程由预先选择的一系列的节点所掌控,例如,设想一个有15个金融机构的团体,每个机构都操作一个节点,为了使区块生效,其中的 10个必须签署那个区块。阅读区块链的权利可能是公开的,或仅限于参与者,也有混合的路径,比如区块的根散表和应用程序编程接口一起公开,使公共成员可以进行一定量的查询,重获一部分区块链状态的加密图形证明。这类区块链被认为是“部分去中心化”。
- 私有链:书写许可对一个组织保持中心化。阅读许可可能是公开的或者限制在任意程度。应用很可能包含对单个公司内部的数据库管理,审查等,因此公共的可读性在很多情况下根本不必要,但在另一些情况下人们又想要公共可读性。
私有链/联盟链可能和公有链毫无联系,他们仍然通过投资以太坊软件开发,对以太坊整体生态系统有利。经过一段时间,这会转变成软件改善,知识共享和工作机会。
4.3 如何连接
Geth会持续尝试在网络上连接到其他节点,直到有了端点为止。如果你在路由器上有可用的 UPnP或者在面向因特网的服务器上运行以太坊,它也会接受其他节点的连接。
Geth通过发现协议找到对等端。在发现协议中,节点互相闲聊发现网络上的其他节点。昀开始,geth会使用一系列辅助程序节点,这些辅助程序节点的端点记录在源代码中。
检查连接和 ENODE身份
要检查客户端在交互控制台上连接了多少对等端点,net模块有两个属性可以提供信息,告诉你对等端点的数量以及你是否在监听的节点。
> net.listening true > net.peerCount
了解更多关于连接对等端点的信息,比如 IP地址、端口号和支持协议,用管理员对象的 peers()功能。admin.peers()会返回到现在已连接的对等端点列表。
> admin.peers [{ ID: 'a4de274d3a159e10c2c9a68c326511236381b84c9ec52e72ad732eb0b2b1a2277938 f78593cdbe734e6002bf23114d434a085d260514ab336d4acdc312db671b', 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: 'a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69 ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c', 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: 'f6ba1f1d9241d48138136ccf5baa6c2c8b008435a1c2bd009ca52fb8edbbc991eba3 6376beaee9d45f16d5dcbf2ed0bc23006c505d57ffcf70921bd94aa7a172', 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: 'f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0 ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0', 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使用的端口,发现你自己的 enodeURI执行:
> admin.nodeInfo { Name: 'Geth/v0.9.14/darwin/go1.4.2', NodeUrl: 'enode://3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2 ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694@ [::]:30303', NodeID: '3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f149 98a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694', IP: '::', DiscPort: 30303, TCPPort: 30303, Td: '2044952618444', ListenAddr: '[::]:30303' }
4.4 更快下载区块链
启动以太坊客户端时,会自动下载以太坊区块链。用于下载以太坊区块链的时间会根据客户端、客户端设置、连接速度和可用的端点数量变化。下面是更快获取以太坊区块链的一些选项。
使用 geth
如果你在用 geth客户端,你可以做些什么来加速下载以太坊区块的时间。如果你用—fast标志来执行以太坊快速同步,不会保留过去的交易数据。
注意:你不能在执行所有或者部分正常的同步操作之后再使用这个标志,也就是说在用这个指令之前,不能下载以太坊区块链的任何部分。查看这个 Ethereum Stack.Exchangeanswer了解更多。
下面是想要更快同步客户端时使用的一些标志。
- --fast 这个标志使通过状态下载而不是下载整个区块数据来实现快速同步成为可能。这样也能大幅减少区块链尺寸。注意:--fast只在从头开始同步区块链,并且是出于安全原因第一次下载区块链时,才会运行。查看 Reddit发文了解更多。
- --cache=1024 分配到内部缓存的千兆内存(昀少 16MB /数据库)。默认是 16MB,所以根据你电脑内存多少,增加到 256, 512,1024 (1GB)或者 2048 (2GB)会带来不同。
- --jitvm 这个标志可以激活 JIT VM。完整的控制台命令示例:
geth --fast --cache=1024 --jitvm console
了解更多关于快速同步和区块链下载次数的讨论,查看这篇 Reddit发文。
导出/导入区块链
如果你已经同步了整个以太坊节点,可以从完全同步的节点中导出区块链数据并将其导入新节点。你可以在 geth中用 geth export filename指令导出所有节点,并用 geth import filename将区块链导入节点,来实现这一目的。
4.5 静态节点,信任节点和启动节点
Geth支持一个叫静态节点的特征,如果你有特定的端点,你会一直想与静态节点连接。如果断开连接,静态节点会再次连接。你可以配置永久性静态节点,方法是将如下所说的放进<datadir>/static-nodes.json(这应该是和 chaindata以及 keystone在同一个文件夹)
[ "enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b99 5de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@ 33.4.2.1:30303", "enode://pubkey@ip:port" ]
你也可以在运行期间通过 Javascript使用 admin.addPeer()加入静态节点。
> admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e2 96f5e4a54e8b995de102e0ceae
连接的常见问题
有时候可能无法连接,昀常见的原因有:
- 本地时间不正确。要参与到以太坊网络中,需要精确的时钟。检查 OS如何同步时钟(例如 sudo ntpdate -stime.nist.gov),即便只快了 12秒也有可能导致 0端点。
- 有的防火墙配置可能会阻止 UDP流通。可以用静态节点功能或者控制台上的 admin.addPeer()来手动配置连接。
不使用发现协议来启动 geth,你可以用—nodiscover参数。你只会在运行测试节点或有固定节点的实验测试网络时才想要这样做。