如何优雅的搭建私有链
本篇内容已经转到这里,这一篇是失败品
http://www.cnblogs.com/tianlongtc/p/8877579.html
首先,请确保电脑上面已经安装了 ethereum
建议先了解 geth 和 linux 相关指令再进行操作。
第1步 - 创建datadir文件夹
在运行私有链时,强烈建议使用特定文件夹来存储私人区块链的数据(数据库和钱包),而不会影响用于存储来自公共区块链的数据的文件夹。
在您的计算机上,创建托管您的第一个矿工的文件夹:
$ mkdir -p ~/ChainSkills/miner1
重复第二个矿工的操作:
$ mkdir -p ~/ChainSkills/miner2
第2步 - 创建创世区块文件
每个区块链都以一个用于初始化区块链的起始区块开始,并定义加入网络的条款和条件。
我们的创世块被称为“ genesis.json” ,并存储在“ 〜/ ChainSkills ”文件夹下。
在〜/ ChainSkills下创建一个叫做genesis.json的文本文件,内容如下:
{ "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "difficulty": "0x400", "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x436861696e536b696c6c732047656e6573697320426c6f636b", "gasLimit": "0xffffffff", "config": { "chainId": 42, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }
在上面参数中,我们有以下几个参数:
- difficulty:如果难度低,交易将在我们的私人区块链中迅速处理。
- gasLimit:定义每个区块的gas支出限额。gasLimit设置为最大值,使我们在测试的时候不受限制。
第3步 - 初始化私人区块链
步骤3.1 - 初始化矿工#1
输入以下命令为第一个矿工创建区块链:
cd ~/ChainSkills
geth --datadir ~/ChainSkills/miner1 init genesis.json
执行完成之后,miner1目录下面会出现 geth 和 keystore 两个文件夹
- geth: 包含您的私有链的数据库。
- keystore: 用于存储您将在此节点上创建的帐户的钱包位置。
步骤3.2 - 初始化矿工#2
cd ~/ChainSkills
geth --datadir ~/ChainSkills/miner2 init
第4步 - 创建帐户
为我们的矿工创建一些账户。
步骤4.1 - 创建矿工#1的账户
创建将用于运行节点的默认帐户。
该账户将收到矿工在私人区块链中创建的以太币。这些以太币可以用来支付处理每笔交易所需的gas来测试我们的方案。
要为矿工#1创建默认账户,请键入以下命令。将密码保存在安全的地方:
$ geth --datadir ~/ChainSkills/miner1 account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {ae3ab39b3ebc425289dad620aece197a4a3f8940}
$ geth --datadir ~/ChainSkills/miner1 account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {ae3ab39b3ebc425289dad620aece197a4a3f8940}
注意上面执行了两次,查看账户钱包和账户结点
$ ls -al ~/ChainSkills/miner1/keystore
$ geth --datadir ~/ChainSkills/miner1 account list
步骤4.2- 创建矿工#2的账户
和矿工1类型,执行两次
$ geth --datadir ~/ChainSkills/miner2 account new
$ geth --datadir ~/ChainSkills/miner2 account new
第5步 - 准备矿工
我们准备从我们的电脑启动矿工,并挖掘一些以太币。
步骤5.1 - 矿工#1:设置
$ cd ~/ChainSkills/miner1
$ vim password.sec #在里面输入密码,ESC + :wq! 退出
创建一个shell脚本,方便我们以后操作
$ vim startminer1.sh
#!/bin/bash geth --identity "miner1" --networkid 42 --datadir "~/ChainSkills/miner1" --nodiscover --mine --rpc --rpcport "8042" --port "30303" --unlock 0 --password ~/ChainSkills/miner1/password.sec --ipcpath "~/Library/Ethereum/geth.ipc"
主要参数的含义如下:
- identity:我们节点的名称
- networkid:该网络标识符是一个任意值,将用于配对同一网络中的所有节点。此值必须不同于0到3
- datadir:我们的私有链存储其数据的文件夹
- rpc和rpcport:启用HTTP-RPC服务器并给出其侦听端口号
- port:网络侦听端口号,节点之间相互连接以传播新的事务和数据块
- nodiscover:禁用发现机制(稍后我们将配对节点)
- mine:我的以太币和交易
- unlock:默认帐户的ID
- password:包含默认帐户密码的文件路径
- ipcpath:路径在哪里存储IPC套接字/管道的文件名 (注意这个,后面可能会出错)
步骤5.2 - 矿工#1:开始挖矿
将 startminer1 脚本设置为可执行
$ cd ~/ChainSkills/miner1
$ chmod + x startminer1.sh
开始挖矿,执行脚本
$ ./startminer1.sh
步骤5.3 - 矿工#1:JavaScript控制台
> geth attach
> miner.start()
> miner.stop()
miner.start() 放回 null 的可以参考我另一篇文章: http://www.cnblogs.com/tianlongtc/p/8871472.html
geth attach 出现下面错误,返回5.1修改 ipcpath 路径 ,修改为下面加粗的路径
root@vultr:/usr/bin/go-ethereum/build/bin# geth attach
Fatal: Unable to attach to remote geth: dial unix /root/.ethereum/geth.ipc: connect: no such file or directory
上面这种错误是我运行的时候出现的,找到对应的解释如下:
You will notice that “geth attach” didn’t need any additional parameters. The reason is that the “geth.ipc” file is generated into the Ethereum default directory.
步骤5.4 - 矿工#1:停止
步骤5.3正常运行,想要停止挖矿,可以执行 CTRL + C 强制停止挖矿
第6步 - 在矿工#1内发送以太币
确保自己的账户里面有比特币,如果上面没有挖到矿,可以参考:http://www.cnblogs.com/tianlongtc/p/8871472.html
启动矿工 #1
$ cd ~/ChainSkills/miner1
$ ./startminer1.sh
再开一个终端,启动geth 控制台
geth attach
检查余额
> eth.coinbase
列出所有账户:(确保自己有两个或两个以上的账户,没有可以参照:http://www.cnblogs.com/tianlongtc/p/8857720.html)
> eth.accounts
查看账户有多少 wei
> eth.getBalance(eth.accounts[0])
> eth.getBalance(eth.accounts[1])
查看账户有多少 ether
> web3.fromWei(eth.getBalance(eth.coinbase))
从账户 #0 发送10个 ether 给账户 #1
> eth.sendTransaction({from:eth.accounts [0],to:eth.accounts [1],value:web3.toWei(10,“ether”)})
由于现在已经停止挖矿,我们可以查看带处理交易的清单
> eth.pendingTransactions
[{ blockHash: null, blockNumber: null, from: "0x3e3753727dd6d965c0c696ea5619b8050ca89a49", gas: 90000, gasPrice: 20000000000, hash: "0x4ed5ef14cb5df5069059ac201a7294d810b89dcc05c0f60f970b87bff7faa5b6", input: "0x", nonce: 0, r: "0xdfd5465e315207e41d10a01189c41a1e9b42e7577cd256a100b3fa2157e9b0", s: "0x39b10c973c1e9764e9b3cfd98339164d65e78971c917ae24fe880a2a7c775cf6", to: "0xae3ab39b3ebc425289dad620aece197a4a3f8940", transactionIndex: null, v: "0x1c", value: 10000000000000000000 }]
- 发件人地址
- 收件人地址
- 转让价值(以 wei 为单位)
- 交易的散列地址
- wei 的交易成本(gas x gas价格)
让矿工处理交易:
> miner.start()
> eth.pendingTransactions
> web3.fromWei(eth.getBalance(eth.accounts [1]))
如果没有出现问题的话,恭喜你的矿工#1安装正确!
第7步 - 矿工 #2
矿工 #2 的所有执行步骤同矿工1,在这里我就不重复了
第8步 - 在私有区块链的节点之间发送ethers
哇哇哇,心好累,试了一天,