区块链以太坊私有链部署及学习

区块链以太坊私有链部署及学习

区块链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
区块链为去中心化的代表产物,近年来一直备受关注,想着首先从源头开始,学习自己搭建一个自己的私有链进行学习一下基本的逻辑及对象。

区块:
Block-由交易和数据组成的数据块,一般由矿工以各种竞争的方式进行打包(获取奖励)

矿工:
Miner-一般指链中的账户,每个账户都可以是矿工,进行挖矿打包工作来赚取打包费。

交易:
Trans-指账户间的交易,数据与数据的交易,数据与合约的交易,合约与合约的交易等,交易一般会收取汽油gas费。

合约:
Contract-这里一般指链上的一段固定代码,接受指定的数据经过逻辑做出对应的操作。

其中矿工和合约均会以账户的形式存在与链上,与账户“交流”的方式就是知晓其地址,即address。

搭建私有链从环境开始

本人搭建环境为:

1
2
3
4
5
6
7
aliyun ubuntu 18.04

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

当输入

1
2
geth --help
出现版本及参数提示时即为安装成功

当然大家也可以选择从源代码中直接编译安装

接下来是创建私有链账户

先准备好一个文件夹,例如我这里为GethBlock

使用命令geth —datadir GethBlock account new然后输入密码两次创建一个账户,此时会返回给你一个address记住这个address,再重复创建另一个账户,记下address。

接下来就是创世区块文件编写开始,将创建的两个账户address插入到alloc内,balance为余额,设置余额的目的是为了在启动链时可以直接进行交易来让矿工挖出区块,避免因为余额不足导致无法挖出区块的问题。

genesis.json文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"config": {
"chainId": 999,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "8000000",
"difficulty": "1",
"coinbase": "0xa0Fc8b3D878DEFAF76a3DaF003E8190b35c55eAA",
"alloc": {
"a0Fc8b3D878DEFAF76a3DaF003E8190b35c55eAA":{
"balance":"20000009800000000000000000000"
},
"CDf98f5e8319D0d4DCbA883a3294fe734e30f380":{
"balance":"20000009800000000000000000000"
}
},
"number": "0x0",
"gasUsed": "0x01"
}

一些参数的解释

chainId不建议设置为1,因为1是以太坊主链,若设置为1则后续挖掘区块会因为diffculty的数字过大而导致无法挖出区块来。

diffculty的数字建议小一些,这样自己挖掘的难度也会小很多

coinbase指启动链时默认的账户为这个地址。可以为0x0000000…000,启动后当你创建第一个账户后默认为第一个创建的账户。

balance为余额,单位为ether

gaslimit为gas的限制,gas会随着交易额等因素动态变化,此项可限制其额度。

初始化私有链

使用命令geth --datadir GethBlock init genesis.json来初始化私有链

此时初始化成功,创建password文件,将两个账户的密码分两行写入文件中

启动链命令如下

geth --datadir GethBlock --networkid 999 --unlock '0,1' --password password.txt --nodiscover console 2>>geth.log

命令详解

—datadir为指定的数据存放文件夹,—networkid为网络标识号 —unlock—password为默认启动时解锁password.txt的第0行和第1行的账户(后面操作转账时不需再次验证解锁),console为进入命令行操作界面,2>>geth.log为将操作日志写入geth.log中

进入命令行后为

1
2
3
4
5
6
7
8
9
eth.coinbase查看当前账户地址
eth.accounts查看当前链账户列表
eth.blockNumber查看当前区块数量
eth.getBalance("")获取账户的余额
eth.sendTransaction({from:eth.accounts[1],to:eth.accounts[2],value:am})
miner.start(1)使用当前账户为矿工账户进行挖矿括号内为线程数
am = web3.toWei(50,'ether')
admin.addPeer()节点接入参数为admin节点的ennode信息

先设定一个数值,然后直接发起交易(sendTransaction),然后进行挖矿(miner.start),等待进度条precent进行到100时即可成功挖出区块,此时提示(successfully)区块产生,交易已被打包,查看转账账户余额即可。