如何优雅的搭建私有链

本篇内容已经转到这里,这一篇是失败品

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

重复相同的操作,通过指定自己的目标文件夹(〜/ ChainSkills / miner2)来初始化第二个矿工:

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:设置

首先创建一个文件,其中包含我们默认帐户的密码,这是我们为每个矿工创建的第一个帐户。
在〜/ ChainSkills / miner1 /下创建一个password.sec文件,该文件包含您为miner1上的第一个帐户配置的密码,以明文形式显示。

$ 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 Javascript控制台管理您的矿工
例如,您可以启动和停止从控制台挖掘或发送事务。
 
这个控制台需要连接到一个正在运行的Geth实例。
 
打开一个新的终端会话并输入
> 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

 

哇哇哇,心好累,试了一天,

posted @ 2018-04-17 22:26  tianlongtc  阅读(617)  评论(0编辑  收藏  举报