.. _sec:connecting-to-the-network: ******************************************************************************** 连接到网络 ******************************************************************************** 这个章节 以太坊网络 ================================================================================ 被通过p2p网络连接的节点共同维护和确认的区块链是去中心化一致性的基础。 以太坊网络状态 -------------------------------------------------- `EthStats\.net `_ 是以太坊网络的实时统计网站,网站上显示了诸如当前块、哈希难度、gas价格和gas消耗等信息。网页上显示的节点仅仅是网络上比较活跃的节点。任何人都可以把自己的节点加入到EthStats的页面上,想了解如何加入,请 `查看加入网络的详细描述 `_ 。 `EtherNodes\.com `_ 显示了主网络和测试网络节点数量的当前和历史数据,此外还有一些别的信息。 `Etherchain.org `_ 显示以太坊区块链的实时状态。(译者注:这个网站十分好用,可以查看账户信息,还有API可供使用) 公有、私有和联合区块链 ------------------------------------------------ 现在大多数的以太坊工程都是依赖于以太坊的公有链,公有链上有数量巨大的用户、网络节点、货币和市场。然后,也经常会有一些原因使得情况更倾向于使用私有链和联合链(一些互相信任的参与者之间)。例如:像银行这样的组织,就在寻找以太坊这样的平台作为它们的私有链。 下面的章节节选自 `On Public and Private Blockchains `_ 基于权限分别阐述了三种区块链的不同。 - **公有链**: 一条公有链就是全世界任何人都可以读取的区块链,世界上任何人都可以发送交易,如果交易是合法的那么都可以被查询到,世界上任何人都可以参与到一致性协商都过程中来,这个过程决定了哪个块会被添加到链上并决定当前的状态。作为集中或准集中信任机制的替代方案,公有链的安全由以下机制共同确保-加密经济学、经济激励和密码学验证,以及工作量证明机制和股权证名机制。在这个原则下,在协商一致性过程中产生的影响和可以承担的经济资源成正比。这样的区块链可以被称为“完全去中心化“的。 - **联合(联盟)区块链**: 联合区块链是指一致性协商的过程是由一些预先选择好的节点控制的区块链,例如:可以想象一个由15家金融机构组成的联盟,其中每一笔交易都需要至少10家机构进行签名,以保证交易的合法性。链上信息的读取权限可以是公开的;可以对成员是受限制的;也可以是混合类型的,例如对于根散列可以通过API允许成员进行有限次的访问,获取部分链状态的加密证明。这类区块链可以被认为是“部分去中心化”的。 - **私有链**: 私有链是一条完全私有的区块链,区块的写权限只属于一个中心化的组织。读权限可以是公开的也可以是任何受限制的程度。例如:公司内部的程序所包含的数据库管理、审计等,这种情形的大多数情况下,对外公开的读权限可能不是必须的,虽然有些情况需要公开审计。 虽然私有/联合链可能和公开链没有任何联系,它们对以太坊软件开发的投资仍然是对整个以太坊生态的贡献,随着时间推移,这些努力会转变为软件改进、分享的知识还有就业机会。 如何连接 ================================================================================ Geth会尝试持续连接网络上的节点直到找到一个对等体,如果你的路由器启用了UPnP,或者你的节点运行在一台面向互联网的服务器上,那么你大节点也会接受来自其它节点大连接请求。 Geth通过被称为发现协议的方式搜寻对等节点,发现协议中,节点之间通过网络发送协议寻找彼此。初始化过程中,geth会启动一些记录在源代码中的初始节点。 检查连接情况和ENODE IDs -------------------------------------------------------------------------------- 交互式的命令台中可以查看当前有多少个对等节点被连接,命令 ``net`` 包含两个属性,分别是当前连接的对等节点数量和本地节点的监听状态。 .. code-block:: Javascript > net.listening true > net.peerCount 4 想要获取更多有关连接节点的信息,诸如:IP地址、端口、支持的协议等可以使用 ``admin`` 对象的 ``peers()`` 方法,``admin.peers()`` 方法返回当前对等节点的详细信息列表。 .. code-block:: Javascript > 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使用的端口和当前节点的URI请使用 ``admin.nodeInfo`` : .. code-block:: Javascript > 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' } 更快地下载区块链 ================================================================================ 当你运行以太坊客户端是,以太坊区块链已经开始自动下载了,下载需要花费的时间很大程度上取决于以下因素:客户端类型、客户端设置、网络连接速度、可用节点数目。下面列举出一些可以让下载更快地方法。 When you start an Ethereum client, the Ethereum blockchain is automatically downloaded. The time it takes to download the Ethereum blockchain can vary based on client, client settings, connection speed, and number of peers available. Below are some options for more quickly obtaining the Ethereum blockchain. 使用geth -------------------------------------------------------------------------------- 如果使用geth客户端,下面一些方法能够缩短你下载以太坊区块链的时间。如果你选择使用 ``--fast`` 选项来加快同步时间,那么你将不会得到过去的交易信息。 .. note:: 你不能在正常同步完成后或者正常同步部分数据后使用这个选项,也就是说只能在没有进行过任何数据同步之前使用这个选项,`请点击这里查看更多相关信息 `_ 。 下面这些参数可以加快你的客户端同步速度。 ``--fast`` 这个参数会启动快速同步,只同步最新的数据而不会同步完整的区块链数据,这也会大大节省你的区块链存储空间。注意:处于安全的原因 ``--fast`` 参数只能在没有同步过任何数据的情况下使用, `查看reddit上相关的讨论 `_ 。 ``--cache=1024`` 以(兆字节)为单位的缓存区增长(数据库要求最小16M),默认值为16MB,把这个值增长为256、512、1024(1G)或2048(2G)取决于的节点所拥有的内存(RAM)。 ``--jitvm`` 这个参数启动JIT虚拟机。 完整的命令可以这样写: .. code-block:: Bash geth --fast --cache=1024 --jitvm console 更多减少同步下载时间的话题可以在reddit上查看相关讨论,查看 `see this Reddit post `_ 。 导出/导入区块链数据 -------------------------------------------------------------------------------- 如果你已经有一份同步完毕的以太坊节点数据,你可以从完整的节点导出一份数据,然后导入到新的节点上。你可以使用命令 ``geth export filename`` 从完整节点导出数据,然后使用命令 ``geth import filename`` 在新的节点上导入,细节请查看 `静态节点数据 `_ 。 .. _cr-static-nodes: 静态节点、授信节点、启动节点 ================================================================================ Geth支持一个被称为静态节点的特性,如果你拥有一台稳定连接在网络上的节点,就可以被称为静态节点。你可以把静态节点的地址写入到一个名为static-nodes.json的ASCII文件中,并将这个文件放在与 ``chaindata`` 和 ``keystore`` 平行的目录中。 static-nodes.json文件格式如下,每个节点占用一行: .. code-block:: Javascript [ "enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303", "enode://pubkey@ip:port" ] 你也可以在运行过程中使用JavaScript命令台添加静态节点 ``admin.addPeer()`` .. code-block:: Console > admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303") 连接的常见问题 -------------------------------------------------------------------------------- 经常会发生你无法连接到任何节点的情况发生,很大可能是因为如下原因: * 你本地的时间不正确,正确的本地时间是以太坊网络所必需的,请检查你的系统时间并同步系统时间(例如命令: ``sudo ntpdate -s time.nist.gov``),本地时间误差达到12秒都能导致0连接的情况发生。 * 一些防火墙设置项会防止UDP数据流拥堵,你可以尝试通过命令 ``admin.addPeer()`` 手动添加一些静态节点来解决这个问题。 你可以通过参数 ``--nodiscover`` 关闭发现协议来启动geth,你可能想在测试网络中这样做或者在网络中测试固定的节点。