测试网络

Morden测试网络

Morden是一个以太坊备选点测试网络,它属于前沿(Frontier)和家园(Homestead)里程碑版本的后续产物。

使用方法

eth(C++客户端)

0.9.93版本以上的客户端支持这个网络,通过在启动时传入参数 --morden 来连接:

> eth --morden

PyEthApp(Python客户端)

PyEthApp客户端的v1.0.5以上版本支持morden网络:

> pyethapp --profile morden run

geth(Go客户端)

> 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

{
                "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测试网络的以太币:

设置本地私有链

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” 可以让你在测试网络中快速挖到以太币,如果你在自己的私有链上挖矿,你可以每分钟开采出数以百计的以太币,这已经足够在你自己的测试网络进行交易测试了。如果你还想预先发放以太币到你的帐号中,你需要按照如下步骤进行操作:

  1. 在创建完私有链后创建一个以太坊帐号;
  2. 拷贝你的新帐号地址;
  3. 把下面的命令添加到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`)。