连接到网络

以太坊网络

保持和保护区块链的相互协作的节点所组成的P2P(peer-to-peer)网络,是去中心化一致性的基础。参见 挖矿

以太坊网络状态

EthStats.net 是以太坊网络实时统计数据的仪表盘。它显示了一些重要的信息,比如当前区块、哈希难度、气的价格以及气的消耗。在这个页面显示的节点,仅是网络中实际节点的一部分。任何人都可以将他们的节点添加到这个仪表盘。 Eth-Netstats README on Github 记述了如何进行连接。

EtherNodes.com 显示以太坊主网络和最新测试网络中当前及历史节点统计以及一些其他信息。

当前活动网络的一些统计信息 - EtherChain上的实时状态信息。

公链、私有链和联盟链

目前,大多数以太坊项目都将以太坊作为一个提供了大量用户接入、网络节点、货币和市场的公共的区块链。然而,也通常会有些特定的原因,使人们也倾向于使用一个私有链或联盟链(某些内部相互信任的团体)。例如一些垂直领域的公司团体,像银行,正把以太坊视为他们自己的私有链的基础平台。

以下是一位发表了 On Public and Private Blockchains 的专家,根据访问权限的不同所给出的以上三种区块链的区别。

  • 公链(Public blockchains):公链,是一个世界上的任何人都可以读取的,任何人都可以向它发送交易,并在交易合法之后就能被记录的区块链;并且世界上的任何人都可以参与到共识过程(一个决定哪个区块会被加到链上并反映当前数据状态的过程)。作为中心化/准中心化信任体系的替代,公链基于加密经济学原理确保其安全可信,即将经济学原理与加密校验相结合,使用工作量证明或权益证明算法,并基于一个抽象概念:一个人能对共识过程施加的影响的程度,是与他可以运用的经济资源的数量相称的。这些区块链通常被认为是“完全去中心化”的。
  • 联盟链(Consortium blockchains):联盟链,是一个共识过程由预先确定好的若干节点来控制的区块链。例如,我们可以想象一个由15个金融机构所组成的联盟链,需要其中10个以上机构控制的节点签名承认某个区块才能使该区块有效。读取这个区块链的权限可以是公开的,或者限制为仅联盟成员,并且还可能有混合路由来访问。这种混合路由是指联盟链上节点的根哈希与特定的API一起公开,以使公共成员可以做某些特定的查询,取得关于区块链状态的某些数据。这些区块链可以被认为是“部分去中心化”的。
  • 私有链(Private blockchains):私有链,是一个写入权限由中心化的某一个组织所控制的区块链。而读取权限可以是公开的或者任意扩展的。就像现在的大多数应用程序一样,数据库的维护和审计等等工作由一个单独的公司负责。这样,在很多情况下,公开的数据读取就完全没必要了,尽管也有一些情况会希望可以有公开的审计能力。

尽管这些私有链/联盟链也许没有到公链的连接,但他们依然可以通过资助以太坊软件的开发来共建以太坊生态系统。随着时间的推移,这些终将变为软件的改进、知识的分享以及相应的工作机会。

如何连接

Geth会不停地尝试连接到网络上其他节点直到连接到若干端点上。如果你的路由器允许UPnP连接,或者在一个有Internet连接的服务器上运行以太坊的话,它也会接受来自其他节点的连接请求。

Geth通过 发现协议(discovery protocol) 来找到其他节点。在发现协议中,节点间会互相通信以感知网络中的其他节点。为了相应的初始化,Geth会使用一些记录在源代码中的端点来找到一些引导节点。

检查连通性和ENODE ID

net 模块有两个属性可以告诉你当前客户端已经与多少端点相连接,以及你是否是监听节点。

> net.listening
true

> net.peerCount
4

使用 admin 对象的 peers() 函数来获取更多信息,比如IP地址、端口号以及所支持的协议。 admin.peers() 会返回当前已连接的所有节点信息。

> 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,执行:

> 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 的文章

以下是一些参数可以帮你更快的同步你的客户端数据。

--fast

这个参数允许快速同步数据状态,而不是下载整个区块数据。这也会极大的降低你本地的区块链数据大小。 注意: --fast 出于安全的考虑,该参数仅在你第一次同步区块链数据时可以使用。 更多信息请参考这个Reddit帖子

--cache=1024

以兆字节(MB)为单位的内部缓存大小。缺省为16MB,可以根据你的计算机内存容量增加到256、512、1024(1GB)或2048(2GB),这将会有较大的区别。

--jitvm

该参数将打开JIT VM(即Just-In-Time Virtual Machine,可以提高某些高频使用指令的执行效率,译者注)模式。

完整的命令行样例:

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

更多关于快速同步和区块链下载次数的讨论, 请参考这篇Reddit帖子

导出/导入区块链

如果你已经同步了以太坊全节点数据,你可以把这些数据导出,然后再导入到一个新的节点中。在Geth中,你可以使用 geth export filename 命令导出全节点数据,而后使用 geth import filename 把数据导入新节点。 参考 这个链接

静态节点、信任节点和引导节点

Geth支持一个叫做“静态节点”的特性。当你有若干固定的节点总是希望能连接到时,你可以使用静态节点在连接断开时自动重连。你可以在 <datadir>/static-nodes.json 中加入以下设置来配置永久的静态节点。(这个目录应该与你的 chaindatakeystore 目录在同一个目录下。)

[
      "enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",
      "enode://pubkey@ip:port"
]

你也可以在运行时使用 admin.addPeer() 命令通过JavaScript命令行添加静态节点。

> admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303")

关于连通性的一般问题

有时你就是连接不上,最常见的原因可能是:

  • 你的本地时间可能不正确。在以太坊网络中需要精确的时钟。查看你的操作系统如何同步时钟(例如 sudo ntpdate -s time.nist.gov )因为即使只是快12秒,都有可能导致一个节点都找不到。
  • 有些防火墙设置会屏蔽UDP数据广播。你可以使用静态节点特性或在控制台使用 admin.addPeer() 来手工配置连接。

你可以使用 --nodiscover 参数启动geth,使之不使用节点发现协议。只有在你正运行一个测试节点或者使用测试网络中的固定节点时你才需要这么做。