以下说明介绍了如何使用Go-Ethereum客户端安装以太坊区块链的单节点私有安装。
先决条件:
Ubuntu 16.04虚拟机(例如来自Azure,Standard_A1
本教程的大小应该没问题)
在Linux命令行上工作的基本经验
步骤1:使用最新的软件包更新Ubuntu安装
sudo apt-get update sudo apt-get -y upgrade
第2步:安装golang-go软件包
wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz sudo tar -xvf go1.7.4.linux-amd64.tar.gz sudo mv go / usr / local export GOROOT = / usr / local / go export PATH = $ GOPATH / bin:$ GOROOT / bin:$ PATH
第3步:从github构建go-ethereum
git clone https://github.com/ethereum/go-ethereum.git ~/go-ethereum cd ~/go-ethereum git checkout master make geth cd ~
第4步:测试geth安装
go-ethereum/build/bin/geth version
预期的回应类似于:
Geth Version: 1.6.1-unstable Git Commit: e353f9c0886f0cc13fd01c8b3abf2fa63025c62f Architecture: amd64 Protocol Versions: [63 62] Network Id: 1 Go Version: go1.7.5 Operating System: linux GOPATH= GOROOT=/usr/local/go
第5步:创建一个账户用作区块链节点
硬币库以太坊账户是存储以太币的公钥,将用于私有区块链支付燃气费用。在我们开始区块链之前,我们需要创建一个开采奖励也将存入的账户。
go-ethereum/build/bin/geth account new
系统会提示您为该帐户设置密码,请勿忘记密码,以后将无法恢复,并且无法使用您的密码或解锁该帐户。输入密码两次后,您应该可以得到如下回复:
Address: {941f1f0b08757457be0b52d83a1e3e566473ed61}
这是以太坊账户的公钥。以太坊惯例是为帐户添加0x前缀,因此该帐户有时被视为0x941f1fobo8757457be0b52d83a1e3e566473ed61.
第6步:为Genesis块创建JSON文件以引导专用区块链
使用文本编辑器创建CustomGenesis.json
包含以下内容的文件:
{ "config": { "chainId": 13, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "200000000", "gasLimit": "2100000", "alloc": { "941f1f0b08757457be0b52d83a1e3e566473ed61": { "balance": "100000000" } } }
第7步:从您的文件初始化区块链CustomGenesis.json
go-ethereum / build / bin / geth init ./CustomGenesis.json
你应该期望看到类似这样的输出:
INFO[02–23|20:20:03] Allotted 128MB cache and 1024 file handles to /home/ubuntu/.ethereum/geth/chaindata INFO[02–23|20:20:04] closed db:/home/ubuntu/.ethereum/geth/chaindata INFO[02–23|20:20:04] Allotted 128MB cache and 1024 file handles to /home/ubuntu/.ethereum/geth/chaindata INFO[02–23|20:20:04] successfully wrote genesis block and/or chain rule set: 5dd3be94dcbf5216aaa3e82700fb51a831257df5d45d984941a0a32ee0f960d8
恭喜!您已初始化私人以太坊区块链!
在我们继续之前,让我们休息一下对我们生成的文件进行一些可选的探索。在您的主目录中,您现在将看到一个名为的隐藏目录 .ethereum
。
你会看到两个文件夹,geth和
keystore
。
keystore
包含包含客户端可用的以太坊帐户的文本文件。应该只有一个文件对应于我们在第7步中创建的帐户。该文件是JSON格式的ascii文本,其外观与此类似:
{“address”:”941f1f0b08757457be0b52d83a1e3e566473ed61",”crypto”:{“cipher”:”aes-128-ctr”,”ciphertext”:”16ad7e9df7036894a470520ed1d8aa241cbc1900c342f212 21acc62d548f0de0",”cipherparams”:{“iv”:”220c432b1cd2925576902a3c9afe026b”},”kdf”:”scrypt”,”kdfparams”:{“dklen”:32,”n”:262144,”p”:1,”r”:8,”salt”:”1cb8 e838e53980639df458b43c6bca4a5312abc27062e989a8d87d584efd0b3b”},”mac”:”598533d190ad4350e3b12cecc9220b77b7e1797b305294421503bbac5c5ec4d3"},”id”:”53ceeb 66-a6df-4064-bf8d-5689bd9ee98b”,”version”:3}
您会注意到公钥以明文形式存在“address”:”941f1f0b08757457be0b52d83a1e3e566473ed61"
,私钥在文件中使用您在创建帐户时提供的密码加密。
geth
包含一个文件夹chaindata
。该chaindata
文件夹包含代表区块链生成的leveldb数据库文件以及在开采并添加到区块链中的后续区块。随着时间的推移,这个文件夹的大小会增加,如果删除或丢失,整个区块链消失了,需要重新初始化。
如果您想备份区块链或将其移动到新服务器,只需复制整个 .ethereum
文件夹并将其恢复到新服务器的主目录。
好的,让我们回到我们的区块链。
第8步:启动区块链!
go-ethereum / build / bin / geth \ --mine \ --nodiscover \ --maxpeers 0 \ --networkid 13 \ --rpc \ --rpccorsdomain“*”
用以下命令行参数启动geth
--mine Enable mining --nodiscover Disables the peer discovery mechanism (manual peer addition) --maxpeers value Maximum number of network peers (network disabled if set to 0) (default: 25) --networkid value Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten) (default: 1) --rpc Enable the HTTP-RPC server --rpccorsdomain value Comma separated list of domains from which to accept cross origin requests (browser enforced)
您需要指导您的节点进行挖掘,以便创建块,并且在您开始向链中发送事务时,它们将被处理并包含在块中。在nodiscover
和maxpeers
参数只是为了安全,使您的链实现不尝试发现任何同行,也没有接受任何端点请求。我们将networkid
参数的值设置为一个不为1,2,3或4的随机整数,因为它们被保留作为公共以太坊网络的标识符。最后,我们启用rpc,以便您的链响应远程JSON-RPC API调用,如以下所述:https://github.com/ethereum/wiki/wiki/JSON-RPC。
当您的链块第一次启动时,它会生成一个DAG。有关这意味着什么的更多细节,请访问https://github.com/ethereum/wiki/wiki/Ethash-DAG。这只会在你第一次开始你的连锁店时发生。输出将如下所示:
INFO[02–23|21:57:54] Allotted 128MB cache and 1024 file handles to /home/ubuntu/.ethereum/geth/chaindata INFO[02–23|21:57:54] closed db:/home/ubuntu/.ethereum/geth/chaindata INFO[02–23|21:57:54] instance:Geth/v1.6.0-unstable-11539030/linux/go1.6.2 INFO[02–23|21:57:54] Allotted 128MB cache and 1024 file handles to /home/ubuntu/.ethereum/geth/chaindata INFO[02–23|21:57:54] Protocol Versions: [63 62], Network Id: 1999 INFO[02–23|21:57:54] Chain config:{ChainID: 0 Homestead: <nil> DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: <nil> EIP158: <nil>} INFO[02–23|21:57:54] Last header: #227 [073961f2…] TD=31476282 INFO[02–23|21:57:54] Last block: #227 [073961f2…] TD=31476282 INFO[02–23|21:57:54] Fast block: #227 [073961f2…] TD=31476282 INFO[02–23|21:57:54] Starting Server INFO[02–23|21:57:54] HTTP endpoint opened: http://localhost:8545 INFO[02–23|21:57:54] Listening on[::]:30303 INFO[02–23|21:57:54] Automatic pregeneration of ethash DAG ON (ethash dir: /home/ubuntu/.ethash) INFO[02–23|21:57:54] IPC endpoint opened: /home/ubuntu/.ethereum/geth.ipc INFO[02–23|21:57:54] Starting mining operation (CPU=1 TOT=2) INFO[02–23|21:10:11] commit new work on block 1 with 0 txs & 0 uncles. Took 109.907µs INFO[02–23|21:10:11] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000) INFO[02–23|21:10:11] Listening on[::]:30303 INFO[02–23|21:10:11] Automatic pregeneration of ethash DAG ON (ethash dir: /home/ubuntu/.ethash) INFO[02–23|21:10:11] IPC endpoint opened: /home/ubuntu/.ethereum/geth.ipc INFO[02–23|21:10:11] checking DAG (ethash dir: /home/ubuntu/.ethash) INFO[02–23|21:10:12] Generating DAG: 0%
您还会注意到挖掘开始,您的节点将开始生成块:
INFO[02–23|21:14:08] 🔨 mined potential block #1 [0ee888f0…], waiting for 5 blocks to confirm INFO[02–23|21:14:08] commit new work on block 2 with 0 txs & 0 uncles. Took 191.409µs INFO[02–23|21:14:10] 🔨 mined potential block #2 [2179ec7e…], waiting for 5 blocks to confirm INFO[02–23|21:14:10] commit new work on block 3 with 0 txs & 0 uncles. Took 161.908µs INFO[02–23|21:14:10] 🔨 mined potential block #3 [08cb41c7…], waiting for 5 blocks to confirm INFO[02–23|21:14:10] commit new work on block 4 with 0 txs & 0 uncles. Took 216.711µs INFO[02–23|21:14:11] 🔨 mined potential block #4 [d7a60ebd…], waiting for 5 blocks to confirm INFO[02–23|21:14:11] commit new work on block 5 with 0 txs & 0 uncles. Took 781.739µs INFO[02–23|21:14:18] 🔨 mined potential block #5 [eb021a9c…], waiting for 5 blocks to confirm INFO[02–23|21:14:18] commit new work on block 6 with 0 txs & 0 uncles. Took 163.508µs INFO[02–23|21:14:26] 🔗 mined block #1 [0ee888f0…] reached canonical chain INFO[02–23|21:14:26] 🔨 mined potential block #6 [e901a53c…], waiting for 5 blocks to confirm
而已!您的区块链现在正在运行,处理块并监听远程RPC调用,以便您和您的代码可以与其进行交互。实际上,让我们使用JSON-RPC API在这里进行一些测试:https://github.com/ethereum/wiki/wiki/JSON-RPC。这里记录的所有方法都可以针对您正在运行的区块链执行。让链条继续运行,并打开第二个带有外壳的窗口给虚拟机。
现在,从命令行执行这个命令:
curl -X POST --data'{“jsonrpc”:“2.0”,“method”:“web3_clientVersion”,“params”:[],“id”:67}' http:// localhost:8545
你应该收到这样的response:
{"jsonrpc":"2.0","id":67,"result":"Geth/v1.6.0-unstable-11539030/linux/go1.6.2"}
现在检查您的区块链正在挖掘的Ethereum帐户的以太网余额:
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x941f1f0b08757457be0b52d83a1e3e566473ed61", "latest"],"id":1}' http://localhost:8545
你应该收到这样的response:
{"jsonrpc":"2.0","id":1,"result":"0x3ee23bde0e7d200000"}
结果以十六进制形式返回,当转换为十进制时,结果为:1160000000000000000000
。正如该eth_getBalance
方法的文件中所指出的那样,返回的值在wei中,这是ether的最小面额。使用像这样的转换器,您可以将wei中的值转换为ether,以查看您的账户中有1160以太网。如果只有它是真正的以太!这个以太网只对这个专用网络有价值。
从这里开始,您可以开始更多地使用API文档中的方法进行实验,并且您会开始看到与正在运行的区块链进行交互是多么容易。
添加其他节点
现在你有了你的单节点私人区块链。要添加第二个节点,请按照上述步骤构建第二个节点。
接下来,我们将对启动脚本进行一些小修改,以使节点能够相互通信。
首先,我们需要更新启动脚本以允许maxpeers 1
go-ethereum / build / bin / geth \ - mine \ - nodiscover \ - maxpeers 1 \ - networkid 13 \ - rpc \ - rpccorsdomain“*”
接下来,由于我们仍在使用该--nodiscover
选项,因此我们需要明确指示每个节点在启动时与其他节点对等。
每个节点都有它的唯一标识符,称为enode
。该enode
信息将显示在启动时的日志,你会看到在日志类似于此:
enode://98267578205c68fc09e917e67606d8cd6fefd3be84a17c26a9840af003fc8659b[email protected][::]:30303
我们将利用命令行选项来硬编码enode
为节点A到节点B,反之亦然。
--bootnodes
value用于P2P发现引导
的逗号分隔的enode URL 我们需要在上面的enode中做出的唯一更改是填充可以通过端口30303(它是P2P联网的默认端口)访问的节点的IP地址。我们的开始脚本与以下内容类似,其中“enode”被替换为相应的正确值。
go-ethereum/build/bin/geth \ — mine \ — nodiscover \ — maxpeers 1 \ — networkid 13 \ — rpc \ — rpccorsdomain "*" \ — bootnodes 98267578205c68fc09e917e67606d8cd6fefd3be84a17c26a9840af003fc8659b[email protected][IP ADDRESS OF OTHER NODE]:30303
在启动每个实例后,您将能够使用JSON-RPC方法调用来检查它们是否正在对等。
就是这样,从这里开始,您可以继续玩新的连锁店,并尝试使用JSON-RPC API和其他开始标志。
翻译文章,不足谅解。