.. _test-networks: ******************************************************************************** 测试网络 ******************************************************************************** Morden测试网络 ================================================================================ Morden是一个以太坊备选点测试网络,它属于前沿(Frontier)和家园(Homestead)里程碑版本的后续产物。 使用方法 -------------------------------------------------------------------------------- eth(C++客户端) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0.9.93版本以上的客户端支持这个网络,通过在启动时传入参数 ``--morden`` 来连接: .. code:: Console > eth --morden PyEthApp(Python客户端) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PyEthApp客户端的v1.0.5以上版本支持morden网络: .. code:: Console > pyethapp --profile morden run geth(Go客户端) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: Console > geth --testnet 细节 -------------------------------------------------------------------------------- 除了以下参数,其余的信息都和以太坊主网络是一样的: - Network Name: **Morden** - Network Identity: 2 - genesis.json (given below); - Initial Account Nonce (``IAN``) is 2^20 (instead of 0 in all previous networks). - All accounts in the state trie have nonce >= ``IAN``. - Whenever an account is inserted into the state trie it is initialised with nonce = ``IAN``. - Genesis generic block hash: ``0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303`` - Genesis generic state root: ``f3f4696bbf3b3b07775128eb7a3763279a394e382130f27c21e70233e04946a9`` Morden's genesis.json ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: JSON { "nonce": "0x00006d6f7264656e", "difficulty": "0x20000", "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x", "gasLimit": "0x2FEFD8", "alloc": { "0000000000000000000000000000000000000001": { "balance": "1" }, "0000000000000000000000000000000000000002": { "balance": "1" }, "0000000000000000000000000000000000000003": { "balance": "1" }, "0000000000000000000000000000000000000004": { "balance": "1" }, "102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376" } } } 获取Morden测试网络的以太币 -------------------------------------------------------------------------------- 下面两种途径可以获取Morden测试网络的以太币: - 使用CPU/GPU进行挖矿 (查看 :ref:`mining`)。 - 使用 `Ethereum wei faucet `__ 。 ******************************************************************************** 设置本地私有链 ******************************************************************************** .. _custom-networks-eth: eth(C++客户端) ================================================================================ 可以通过参数 ``--genesis`` 和 ``--config`` 来创建一个新的网络。 .. code:: Console > eth --private "customChain" --config config.json --genesis genesis.json 可以同时使用 ``--config`` 和 ``--genesis`` 两个参数。 在这种情况下,由 --config 提供的创世块信息会被 --genesis 提供的信息覆盖。 .. code:: Console --private //定义了私有链的名字(可选参数) .. code:: Console --config .. note:: 包含了JSON格式的网络基础信息描述: - sealEngine (使用的挖矿引擎) "Ethash" 是以太坊工作量证明的引擎(被使用在正式链上)。 "NoProof" 挖矿不需要工作量证明。 - params (网络通用参数设置:包含最少gas消耗、最小难度系数、开采奖励数、网络ID等) - genesis (创世块信息描述) - accounts (设置帐号/合约的原始状态) 下面是一个配置的示例(用户Olympic网络): .. code:: JSON { "sealEngine": "Ethash", "params": { "accountStartNonce": "0x00", "frontierCompatibilityModeLimit": "0xffffffff", "maximumExtraDataSize": "0x0400", "tieBreakingGas": false, "minGasLimit": "125000", "gasLimitBoundDivisor": "0x0400", "minimumDifficulty": "0x020000", "difficultyBoundDivisor": "0x0800", "durationLimit": "0x08", "blockReward": "0x14D1120D7B160000", "registrar": "5e70c0bbcd5636e0f9f9316e9f8633feb64d4050", "networkID" : "0x0" }, "genesis": { "nonce": "0x000000000000002a", "difficulty": "0x20000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "author": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x", "gasLimit": "0x2fefd8" }, "accounts": { "0000000000000000000000000000000000000001": { "wei": "1", "precompiled": { "name": "ecrecover", "linear": { "base": 3000, "word": 0 } } }, "0000000000000000000000000000000000000002": { "wei": "1", "precompiled": { "name": "sha256", "linear": { "base": 60, "word": 12 } } }, "0000000000000000000000000000000000000003": { "wei": "1", "precompiled": { "name": "ripemd160", "linear": { "base": 600, "word": 120 } } }, "0000000000000000000000000000000000000004": { "wei": "1", "precompiled": { "name": "identity", "linear": { "base": 15, "word": 3 } } }, "dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "e6716f9544a56c530d868e4bfbacb172315bdead": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "b9c015918bdaba24b4ff057a92a3873d6eb201be": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "1a26338f0d905e295fccb71fa9ea849ffa12aaf4": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "2ef47100e0787b915105fd5e3f4ff6752079d5cb": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "6c386a4b26f73c802f34673f7248bb118f97424a": { "wei": "1606938044258990275541962092341162602522202993782792835301376" }, "e4157b34ea9615cfbde6b4fda419828124b70c78": { "wei": "1606938044258990275541962092341162602522202993782792835301376" } } } .. code:: Console --genesis (optional if the config option is provided and contains the genesis description). .. note:: 包含JSON格式的创世块描述信息 内容和前面config里面的参数一样: .. code:: JavaScript { "nonce": "0x000000000000002a", "difficulty": "0x20000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "author": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x", "gasLimit": "0x2fefd8" } geth(Go客户端) ================================================================================ 你可以在私有链上预生产以太币,或者通过在私有链上进行挖矿获得以太币,这比在以太坊网络和Morden网络获取以太币高效的多。 在私有链上需要指定以下内容: - 自定义创世文件 - 自定义数据目录 - 自定义网络 - (推荐)禁用节点发现协议 创世文件 -------------------------------------------------------------------------------- 创世块是区块链的开端 - 第一个块,0块,唯一一个没有父节点的块。协议保证了区块链不会接受没有相同创世块的区块信息,所以如果你愿意你可以创建任意多的私有链! :file:`CustomGenesis.json` .. code-block:: JSON { "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { } } 将上面的内容保存到 :file:`CustomGenesis.json` 文件中,下面的命令会引用到这个文件: ``geth init /path/to/CustomGenesis.json`` .. note:: 默认情况下geth会将数据目录设置成和公有链相同的目录,因此建议你使用参数 ``--datadir`` 来设置其它目录来避免这种情况的发生,保证公有链数据的安全。 私有链的命令行参数 -------------------------------------------------------------------------------- 这里有一些必要的参数来确保你使用的是私有链,我们已经说过了genesis参数,但是我们还需要更多的。请注意下面所有的命令都是基于以太坊geth客户端的。 ``--nodiscover`` 使用这个参数可以确保那些没有手动把你加入到静态节点的人(节点)发现你,否则的话,可能你的区块不经意间被添加到一些和你使用相同创世文件和网络ID的陌生人那里。 ``--maxpeers 0`` 使用这个参数并设置成0,表示你不想让任何人加入到你的私有链中,同理,如果你明确知道需要多少节点将要添加进来,那么就设置这个参数为你需要的数量。 ``--rpc`` 这个参数将启动你节点的RPC特性,默认情况下geth都会启动这个特性。 ``--rpcapi "db,eth,net,web3"`` 这个参数规定了哪种类型的APIs被允许通过RPC访问,默认情况下,geth会启动web3类型的接口。 **IMPORTANT: 请注意如果通过RPC/IPC方式提供了API,那么所有可以访问接口的人都可以访问API(例如:dapps)。请小心设置你启动了哪种API,默认情况下,geth启动了所有通过IPC方式的API,只启动了db、eth、net和web3类型通过RPC方式的API。** ``--rpcport "8080"`` 修改服务端口为任意你的网络可用的端口,默认情况下geth使用8080端口。 ``--rpccorsdomain "http://chriseth.github.io/browser-solidity/"`` 这个参数规定了哪些URLs可以连接到你的节点执行RPC任务,请特别小心地使用这个参数指定特定的URL可以连接到你的RPC实例上,而避免使用通配符(*)。 ``--datadir "/home/TestChain1"`` 这个参数指定了你的私有链数据被默认存放的路径,请指定一个和公有链不同的路径进行存储。 ``--port "30303"`` 这个参数设置“网络监听端口”,通过这个端口与其台对等节点进行连接。 ``--identity "TestnetMainNode"`` 这个参数给你的节点设置了一名名字,你可以方便的在对等节点列表中找到自己,这里是个例子,显示你如何在网络中查看自己。 开始启动 ``geth`` -------------------------------------------------------------------------------- 在你创建完创世块的JSON文件、创建完区块数据存放目录后,在命令台中输入如下命令来启动geth: .. code-block:: Console geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "C:\chains\TestChain1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 init /path/to/CustomGenesis.json .. note:: 请把命令参数修改成你自己的设置。 这将初始化你的创世块,然后通过geth命令行来实现交互: .. code-block:: Console geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "C:\chains\TestChain1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console 当你想要访问你的自定义区块链时,你都要启动你的geth实例。如果你仅仅在命令行中输入geth,它将不会记录你之前的参数设定。 通过JavaScript命令台可以使用的所有命令都列举在 `the geth wiki on github `_ 如果你已经有一个geth实例在运行中,你可以通过如下命令来附加额外的geth实例: .. code-block:: Console geth attach 现在你需要在测试网络初始化一个新帐号,然后把它设置成以太币地址(你即将接受挖矿所得的地址)。 在JavaScript命令行中输入: .. code-block:: Console personal.newAccount("password") .. note:: 使用自己的密码来替代上面的password 现在我们来设置以太币接收地址: .. code-block:: Console miner.setEtherbase(personal.listAccounts[0]) 如果成功,命令台会输入"true" 到这里,已经准备好在测试网络中开采以太币: .. code-block:: Console miner.start() 预先申请以太币到你的帐号中 -------------------------------------------------------------------------------- 难度系数为 "0x400" 可以让你在测试网络中快速挖到以太币,如果你在自己的私有链上挖矿,你可以每分钟开采出数以百计的以太币,这已经足够在你自己的测试网络进行交易测试了。如果你还想预先发放以太币到你的帐号中,你需要按照如下步骤进行操作: 1. 在创建完私有链后创建一个以太坊帐号; 2. 拷贝你的新帐号地址; 3. 把下面的命令添加到Custom_Genesis.json文件中: .. code-block:: Javascript "alloc": { "": { "balance": "20000000000000000000" } } .. note:: 用你自己的帐号地址替换上面的地址 ``0x1fb891f92eb557f4d688463d0d7c560552263b5a`` 保存你的创世文件并且返回到你私有链的命令台,如果你的geth在运行就关闭它。我们即将给参数 ``primary`` 设置一个新地址,在你的终端运行命令 ``geth account list`` 来查看你的新帐号被分配到索引号(以#开头)。 .. code-block:: Console > geth account list Account #0: {d1ade25ccd3d550a7eb532ac759cac7be09c2719} Account #1: {da65665fc30803cb1fb7e6d86691e20b1826dee0} Account #2: {e470b1a7d2c9c5c6f03bbaa8fa20db6d404a0c32} Account #3: {f4dd5c3794f1fd0cdc0327a83aa472609c806e99} 请确认哪个#索引是你想要预先添加以太币的地址,替代方案,你可以启动geth命令台,输入如下命令: .. code-block:: Console > eth.accounts 这将会列举出你所拥有的帐号列表。 .. code-block:: Console > primary = eth.accounts[0] .. note:: 用你的帐号索引替换上面的参数 ``0`` ,这个命令将返回你的以太坊主地址。 输入如下命令: .. code-block:: Console > balance = web3.fromWei(eth.getBalance(primary), "ether"); 这将返回 ``7.5`` 表示你有这个数量的以太币,我们在创世文件中的"balance"中设定了一个非常大的数量,为什么仅仅得到真么少的以太币?那是因为文件中的额度是以wei为单位进行计算的,1eth=1e18wei (具体请参考_`Ether`)。 * https://www.reddit.com/r/ethereum/comments/3kdnus/question_about_private_chain_mining_dont_upvote/