测试网络¶
Morden测试网络¶
Morden是一个以太坊备选点测试网络,它属于前沿(Frontier)和家园(Homestead)里程碑版本的后续产物。
细节¶
除了以下参数,其余的信息都和以太坊主网络是一样的:
- 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
.
- All accounts in the state trie have nonce >=
- Genesis generic block hash:
0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303
- Genesis generic state root:
f3f4696bbf3b3b07775128eb7a3763279a394e382130f27c21e70233e04946a9
Morden’s genesis.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" }
}
}
设置本地私有链¶
eth(C++客户端)¶
可以通过参数 --genesis
和 --config
来创建一个新的网络。
> eth --private "customChain" --config config.json --genesis genesis.json
可以同时使用 --config
和 --genesis
两个参数。
在这种情况下,由 –config 提供的创世块信息会被 –genesis 提供的信息覆盖。
--private //定义了私有链的名字(可选参数)
--config <filename>
Note
<filename> 包含了JSON格式的网络基础信息描述:
sealEngine (使用的挖矿引擎)
“Ethash” 是以太坊工作量证明的引擎(被使用在正式链上)。
“NoProof” 挖矿不需要工作量证明。
params (网络通用参数设置:包含最少gas消耗、最小难度系数、开采奖励数、网络ID等)
genesis (创世块信息描述)
accounts (设置帐号/合约的原始状态)
下面是一个配置的示例(用户Olympic网络):
{
"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" }
}
}
--genesis <filename> (optional if the config option is provided and contains the genesis description).
Note
<filename> 包含JSON格式的创世块描述信息
内容和前面config里面的参数一样:
{
"nonce": "0x000000000000002a",
"difficulty": "0x20000",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"author": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x2fefd8"
}
geth(Go客户端)¶
你可以在私有链上预生产以太币,或者通过在私有链上进行挖矿获得以太币,这比在以太坊网络和Morden网络获取以太币高效的多。
- 在私有链上需要指定以下内容:
- 自定义创世文件
- 自定义数据目录
- 自定义网络
- (推荐)禁用节点发现协议
创世文件¶
创世块是区块链的开端 - 第一个块,0块,唯一一个没有父节点的块。协议保证了区块链不会接受没有相同创世块的区块信息,所以如果你愿意你可以创建任意多的私有链!
CustomGenesis.json
{
"nonce": "0x0000000000000042", "timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }
}
将上面的内容保存到 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:
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命令行来实现交互:
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实例:
geth attach
现在你需要在测试网络初始化一个新帐号,然后把它设置成以太币地址(你即将接受挖矿所得的地址)。
在JavaScript命令行中输入:
personal.newAccount("password")
Note
使用自己的密码来替代上面的password
现在我们来设置以太币接收地址:
miner.setEtherbase(personal.listAccounts[0])
如果成功,命令台会输入”true”
到这里,已经准备好在测试网络中开采以太币:
miner.start()
预先申请以太币到你的帐号中¶
难度系数为 “0x400” 可以让你在测试网络中快速挖到以太币,如果你在自己的私有链上挖矿,你可以每分钟开采出数以百计的以太币,这已经足够在你自己的测试网络进行交易测试了。如果你还想预先发放以太币到你的帐号中,你需要按照如下步骤进行操作:
- 在创建完私有链后创建一个以太坊帐号;
- 拷贝你的新帐号地址;
- 把下面的命令添加到Custom_Genesis.json文件中:
"alloc":
{
"<your account address e.g. 0x1fb891f92eb557f4d688463d0d7c560552263b5a>":
{ "balance": "20000000000000000000" }
}
Note
用你自己的帐号地址替换上面的地址 0x1fb891f92eb557f4d688463d0d7c560552263b5a
保存你的创世文件并且返回到你私有链的命令台,如果你的geth在运行就关闭它。我们即将给参数 primary
设置一个新地址,在你的终端运行命令 geth account list
来查看你的新帐号被分配到索引号(以#开头)。
> geth account list
Account #0: {d1ade25ccd3d550a7eb532ac759cac7be09c2719}
Account #1: {da65665fc30803cb1fb7e6d86691e20b1826dee0}
Account #2: {e470b1a7d2c9c5c6f03bbaa8fa20db6d404a0c32}
Account #3: {f4dd5c3794f1fd0cdc0327a83aa472609c806e99}
请确认哪个#索引是你想要预先添加以太币的地址,替代方案,你可以启动geth命令台,输入如下命令:
> eth.accounts
这将会列举出你所拥有的帐号列表。
> primary = eth.accounts[0]
Note
用你的帐号索引替换上面的参数 0
,这个命令将返回你的以太坊主地址。
输入如下命令:
> balance = web3.fromWei(eth.getBalance(primary), "ether");
这将返回 7.5
表示你有这个数量的以太币,我们在创世文件中的”balance”中设定了一个非常大的数量,为什么仅仅得到真么少的以太币?那是因为文件中的额度是以wei为单位进行计算的,1eth=1e18wei (具体请参考_`Ether`)。