(二)搭建私有链
2021-05-04 本文已影响0人
八爪星球
NO.1 创建一个账户
1.创建一个存储私有链数据的文件夹
#mac
mkdir ~/go/src/testChain/data0 # data0用于存放账户和区块数据
cd ~/go/src/testChain
2.连接节点
geth --datadir data --nodiscover console
进入geth控制台(交互式的 Javascript 执行环境),默认端口为8545和30303端口
3. 创建1个账户
personal.newAccount("123456") # 123456为密码
# 出现的以下一串字符,则为创建的账户
"0x7B27Bf95Ad60b0362033DB45401058D57B1A7Cc3"
4. 查询账户余额
eth.getBalance(eth.accounts[0])
# 此时会显示为 0
NO.2 创建创世区块
1. 退出geth的控制台
> exit
INFO [05-04|23:00:53.654] IPC endpoint closed url=/Users/dongyuhuang/go/src/testETH/data0/geth.ipc
INFO [05-04|23:00:53.654] Blockchain manager stopped
INFO [05-04|23:00:53.654] Stopping Ethereum protocol
INFO [05-04|23:00:53.654] Ethereum protocol stopped
INFO [05-04|23:00:53.654] Transaction pool stopped
2. 在testChain目录下,新建gensis.json,内容如下:
{
"alloc": {
"0x7B27Bf95Ad60b0362033DB45401058D57B1A7Cc3": {
"balance": "100000000000000000000000000"
}
},
"config":{
"chainId":10,
"homesteadBlock":0,
"eip150Block": 0,
"eip155Block":0,
"eip158Block":0
},
"nonce":"0x0000000000000042",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x2000",
"alloc": {},
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit":"0xffffffff"
}
////////////////////////////////////////////////////////////以下内容博主自己看的
{
"config": {
"chainId": 628,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
创世区块信息写在一个 JSON 格式的配置文件中
此处我的配置,在"0xdff3488d4ba62cc6bd7180b58d33f9f9fe8bebe8"中预置了1亿的币
各个参数的含义如下:
- mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。
- nonce: nonce就是一个64位随机数,用于挖矿。
- difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
- alloc: 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们也可以不预- 置有币的账号,需要的时候自己创建即可以。
- coinbase: 矿工的账号,随便填
- timestamp: 设置创世块的时间戳
- parentHash: 上一个区块的hash值,因为是创世块,所以这个值是0
- extraData: 附加信息,随便填,可以填你的个性信息
- gasLimit: 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
- chainId:区块链的ID,公链以太坊是1,我们要与其不同,以免冲突
3. 创建创世块
geth --datadir data init genesis.json
初始化成功后,会在数据目录 data 中生成 geth 和 keystore 两个文件夹,此时目录结构如下:
privatechain
├── data
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── lightchaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore
└── genesis.json
其中 geth/chaindata 中存放的是区块数据,keystore 中存放的是账户数据。
NO.3更多操作
1. 转账交易
进入geth控制台
geth --datadir data --networkid 10 console
指定网络id(networkid)为上面设置的10
2.解锁账户
# 123456为密码
personal.unlockAccount(eth.accounts[0],"123456")
3.创建第二个账户
personal.newAccount("654321") # 654321为密码
0xb619729DaECDe98FF7ef9b749CB792B977671f1D
4.发送交易
amount = web3.toWei(10,'ether')
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
控制台操作命令介绍
控制台内置了一些用来操作以太坊的 Javascript 对象,可以直接使用这些对象。这些对象主要包括:
eth:包含一些跟操作区块链相关的方法;
net:包含一些查看p2p网络状态的方法;
admin:包含一些与管理节点相关的方法;
miner:包含启动&停止挖矿的一些方法;
personal:主要包含一些管理账户的方法;
txpool:包含一些查看交易内存池的方法;
web3:包含了以上对象,还包含一些单位换算的方法。
常用命令有:
personal.newAccount():创建账户;
personal.unlockAccount():解锁账户;
eth.accounts:枚举系统中的账户;
eth.getBalance():查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪,1 ether = 10^18 Wei);
eth.blockNumber:列出区块总数;
eth.getTransaction():获取交易;
eth.getBlock():获取区块;
miner.start():开始挖矿;
miner.stop():停止挖矿;
eth.coinbase:挖矿奖励的账户
web3.fromWei():Wei 换算成以太币;
web3.toWei():以太币换算成 Wei;
txpool.status:交易池中的状态;
admin.addPeer():连接到其他节点;