欢迎光临
我们一直在努力

如何建立一个私人以太坊区块链教程

以下说明介绍了如何使用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)

您需要指导您的节点进行挖掘,以便创建块,并且在您开始向链中发送事务时,它们将被处理并包含在块中。在nodiscovermaxpeers参数只是为了安全,使您的链实现不尝试发现任何同行,也没有接受任何端点请求。我们将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://98267578205c68fc09e917e67606d8cd6fefd3be84a17c26a9840af003fc8659bfdaf77128f22216aeeeee8d3ddd3470297d9a8b8c9581d31560f1a2b0964334@[::]:30303

我们将利用命令行选项来硬编码enode为节点A到节点B,反之亦然。

--bootnodesvalue用于P2P发现引导

的逗号分隔的enode URL 我们需要在上面的enode中做出的唯一更改是填充可以通过端口30303(它是P2P联网的默认端口)访问的节点的IP地址。我们的开始脚本与以下内容类似,其中“enode”被替换为相应的正确值。

go-ethereum/build/bin/geth \
 — mine \
 — nodiscover \
 — maxpeers 1 \
 — networkid 13 \
 — rpc \
 — rpccorsdomain "*" \
 — bootnodes 98267578205c68fc09e917e67606d8cd6fefd3be84a17c26a9840af003fc8659bfdaf77128f22216aeeeee8d3ddd3470297d9a8b8c9581d31560f1a2b0964334@[IP ADDRESS OF OTHER NODE]:30303

在启动每个实例后,您将能够使用JSON-RPC方法调用来检查它们是否正在对等。

就是这样,从这里开始,您可以继续玩新的连锁店,并尝试使用JSON-RPC API和其他开始标志。

翻译文章,不足谅解。

 

赞(0) 打赏
未经允许不得转载:折腾派 » 如何建立一个私人以太坊区块链教程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

error: 禁止复制 !!