经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
区块链学习(二)以太坊私有链搭建
来源:cnblogs  作者:Milo196  时间:2019/6/28 8:35:54  对本文有异议

经过一段时间关于以太坊的学习,博主也算是对区块链以及以太坊有了一个初步的了解,整理一篇关于以太坊搭建私有链的方法。

若想以太坊节点之间能够相互连接需要满足一定的条件:

  1. 相同的协议版本
  2. 相同的network id

搭建私有链最简单的方式就是使用geth里的 --network 选项,设置一个与主网不同的network id (以太坊主网id是1)

一、建立创世区块

打开终端输入以下命令

  1. 1 mkdir privatechain #建立文件夹,名字自拟
  2. 2 cd privatechain #终端进入建立的文件夹

建立创世区块文件genesis.json

  1. 1 vim genesis.json #注:没有安装vim 可以用 vi 命令

在创世区块的json文件中填入以下内容:

  1. 1 {
  2. 2 "config": {
  3. 3 "chainId": 20,
  4. 4 "homesteadBlock": 0,
  5. 5 "eip155Block": 0,
  6. 6 "eip158Block": 0
  7. 7 },
  8. 8 "coinbase" : "0x0000000000000000000000000000000000000000",
  9. 9 "difficulty" : "0x100", #为方便挖矿,我们这里将难度值设置的很小
  10. 10 "extraData" : "",
  11. 11 "gasLimit" : "0xffffffff",
  12. 12 "nonce" : "0x0000000000000042",
  13. 13 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  14. 14 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  15. 15 "timestamp" : "0x00",
  16. 16 "alloc": { }
  17. 17 }

各个参数的介绍

参数名称 参数详解
  1. chainId
指定了独立的区块链网络id,网络id在连接到其它节点的时候会用到,以太坊公网id是1,不同的id网络的节点无法相互连接
  1. homesteadBlock
HomesteadBlock是以太坊的第二个主要版本,第一个是Frontier,这个值设置为“0”表示目前正在使用Homestead版本
  1. eip155Block
eip是ethereum improvement proposal的缩写,我们的链不会提议分叉,所以设置为“0”即可
  1. eip158Block
eip是ethereum improvement proposal的缩写,我们的链不会提议分叉,所以设置为“0”即可
  1. coinbase
矿工的账号(随便填)
  1. difficulty
设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
  1. extraData
可以写入32byte大小的任意数据,每个block都会有,由挖出block的miner来决定要不要写点什么
  1. gasLimit
该值设置对gas的消耗总量限制,用来限制区块能包含的交易信息和,因为我们是私有链,所以填最大
  1. nonce
一个用于挖矿的64位随机数
  1. mixhash
与nonce配合用于挖矿,由上一个区块的一部分生成的哈希,注意它和nonce的设置需要满足以太坊的yellow paper
  1. parentHash
上一个区块的哈希值,因为是创世区块,所以这个值是0
  1. timestamp

设置创世区块的时间戳

  1. alloc

给某个账户预分配以太币

二、初始化创世节点,并且设置data目录

在privatechain目录终端下输入如下命令

  1. 1 geth --datadir ./data/00 init genesis.json
  2. 2
  3. 3 #--datadir data 中data是文件夹的名称,私有链的数据会存储在这个文件夹内。若存在其他节点文件名要不同。可以通过“--datadir 文件名”来区分不同的私有链节点,若没有设置--datadir,则会读取以太坊主网的数据,默认位置在/root/.ethereum

出现以日志说明初始化成功

  1. INFO [06-26|21:02:01.682] Maximum peer count ETH=25 LES=0 total=25
  2. INFO [06-26|21:02:01.697] Allocated cache and file handles database=/home/milo/private-geth/data/00/geth/chaindata cache=16 handles=16
  3. INFO [06-26|21:02:01.866] Writing custom genesis block
  4. INFO [06-26|21:02:01.866] Persisted trie from memory database nodes=0 size=0.00B time=4.212µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
  5. INFO [06-26|21:02:01.867] Successfully wrote genesis state database=chaindata hash=696bed1d07ed
  6. INFO [06-26|21:02:01.867] Allocated cache and file handles database=/home/milo/private-geth/data/00/geth/lightchaindata cache=16 handles=16
  7. INFO [06-26|21:02:01.956] Writing custom genesis block
  8. INFO [06-26|21:02:01.956] Persisted trie from memory database nodes=0 size=0.00B time=3.013µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
  9. INFO [06-26|21:02:01.957] Successfully wrote genesis state database=lightchaindata hash=696bed1d07ed

三、启动节点

  1. 1 geth --datadir ./data/00 --networkid 100 console
  2. 2 #100为network id,1为主网id,可以选择除1以外的随机数
  1. milo@milo-K46CB:~/private-geth$ tree
  2. 终端输入tree,查看生成的目录
  3. .
  4. ├── data
  5.    └── 00
  6.    ├── geth
  7.       ├── chaindata
  8.          ├── 000002.ldb
  9.          ├── 000003.log
  10.          ├── CURRENT
  11.          ├── CURRENT.bak
  12.          ├── LOCK
  13.          ├── LOG
  14.          └── MANIFEST-000004
  15.       ├── lightchaindata
  16.          ├── 000001.log
  17.          ├── CURRENT
  18.          ├── LOCK
  19.          ├── LOG
  20.          └── MANIFEST-000000
  21.       ├── LOCK
  22.       ├── nodekey
  23.       ├── nodes
  24.          ├── 000001.log
  25.          ├── CURRENT
  26.          ├── LOCK
  27.          ├── LOG
  28.          └── MANIFEST-000000
  29.       └── transactions.rlp
  30.    ├── geth.ipc
  31.    └── keystore
  32.    └── UTC--2019-06-26T13-02-31.335901324Z--8830397771710ade101f0080f0da076181bad374
  33. └── genesis.json
  1. INFO [06-26|21:02:06.602] Maximum peer count ETH=25 LES=0 total=25
  2. INFO [06-26|21:02:06.604] Starting peer-to-peer node instance=Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.10.4
  3. INFO [06-26|21:02:06.604] Allocated cache and file handles database=/home/milo/private-geth/data/00/geth/chaindata cache=512 handles=2048
  4. INFO [06-26|21:02:06.792] Initialised chain configuration config="{ChainID: 15 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Constantinople: <nil> ConstantinopleFix: <nil> Engine: unknown}"
  5. INFO [06-26|21:02:06.792] Disk storage enabled for ethash caches dir=/home/milo/private-geth/data/00/geth/ethash count=3
  6. INFO [06-26|21:02:06.792] Disk storage enabled for ethash DAGs dir=/home/milo/.ethash count=2
  7. INFO [06-26|21:02:06.792] Initialising Ethereum protocol versions="[63 62]" network=100
  8. INFO [06-26|21:02:06.863] Loaded most recent local header number=0 hash=696bed1d07ed td=256 age=50y2mo1w
  9. INFO [06-26|21:02:06.863] Loaded most recent local full block number=0 hash=696bed1d07ed td=256 age=50y2mo1w
  10. INFO [06-26|21:02:06.863] Loaded most recent local fast block number=0 hash=696bed1d07ed td=256 age=50y2mo1w
  11. INFO [06-26|21:02:06.863] Regenerated local transaction journal transactions=0 accounts=0
  12. INFO [06-26|21:02:07.009] New local node record seq=1 id=1b933112e1333f9a ip=127.0.0.1 udp=30303 tcp=30303
  13. INFO [06-26|21:02:07.015] Started P2P networking self=enode://bfad31051f4ba04bf5bbb2fdd455bfcbf924479991b029a8604ab5abb386431b7c7f7d1edbba0bf6db66ad172b632ca45518239979634f190a0c26c0a9b9864b@127.0.0.1:30303
  14. INFO [06-26|21:02:07.016] IPC endpoint opened url=/home/milo/private-geth/data/00/geth.ipc
  15. Welcome to the Geth JavaScript console!
  16. instance: Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.10.4
  17. modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
  18.  
  19. >

出现这样的日志说明私有网络就搭建成功了,下一步我们来在这个私有网络挖矿。

四、挖矿

要挖矿首先必须要有一个账户,根据以下命令。

  1. > eth.accounts #查看node中的所有账户
  2. []
  3. ##输出了一个“[]”,说明没有账户
  4. > personal.newAccount("123456")
  5. ##创建新账户,123456是账户密码,一般会输出以下结果
  6. "0x8830397771710ade101f0080f0da076181bad374"
  7. > eth.accounts
  8. ["0x8830397771710ade101f0080f0da076181bad374"]
  9. 此时账户已经有了,我们可以进行挖矿了,输入以ixa命令
  10. > miner.start(3)
  11. ##miner.start()是启动挖矿,3是启动线程数,为避免影响电脑性能,这里我们就用3线程

到这里时会出现一些问题,一般来说,第一次启动挖矿,应当会出现以下日志

  1. INFO [05-16|00:07:25] Updated mining threads threads=0
  2. INFO [05-16|00:07:25] Starting mining operation
  3. null
  4. INFO [05-16|00:07:25] Commit new mining work number=1 txs=0 uncles=0 elapsed=38.053ms
  5. INFO [05-16|00:07:28] Generating DAG in progress epoch=0 percentage=0 elapsed=1.715
  6. INFO [05-16|00:07:30] Generating DAG in progress epoch=0 percentage=1 elapsed=3.448s
  7. INFO [05-16|00:07:31] Generating DAG in progress epoch=0 percentage=2 elapsed=5.059s
  8. INFO [05-16|00:07:33] Generating DAG in progress epoch=0 percentage=3 elapsed=6.799s
  9. INFO [05-16|00:07:35] Generating DAG in progress epoch=0 percentage=4 elapsed=8.373s
  10. ##当percentage=100时,也就是加载到100%时,会开始挖矿,这个过程可能会比较慢,要耐心等待。
  11. INFO [06-26|21:10:53.002] Successfully sealed new block number=1 sealhash=dac366ad5c8d hash=3cb840442e46 elapsed=8m9.375s
  12. INFO [06-26|21:10:53.042] ?? mined potential block number=1 hash=3cb840442e46
  13. INFO [06-26|21:10:53.103] Commit new mining work number=2 sealhash=08825466c59d uncles=0 txs=0 gas=0 fees=0 elapsed=60.592ms
  14. INFO [06-26|21:10:53.906] Successfully sealed new block number=2 sealhash=08825466c59d hash=44660293d76b elapsed=803.002ms
  15. INFO [06-26|21:10:53.906] ?? mined potential block number=2 hash=44660293d76b
  16. INFO [06-26|21:10:53.906] Commit new mining work number=3 sealhash=6c39db66d2bf uncles=0 txs=0 gas=0 fees=0 elapsed=178.137µs
  17. INFO [06-26|21:10:54.406] Successfully sealed new block number=3 sealhash=6c39db66d2bf hash=fa550b95d423 elapsed=500.446ms
  18. INFO [06-26|21:10:54.407] ?? mined potential block number=3 hash=fa550b95d423
  19. ##这个就是代表挖到矿了

正常来讲,第一次搭建私有链到这里都没什么问题,而当我第二次开启节点挖矿时出现了问题

  1. > miner.start(3)
  2. INFO [06-26|21:02:43.616] Updated mining threads threads=3
  3. INFO [06-26|21:02:43.626] Transaction pool price threshold updated price=1000000000
  4. INFO [06-26|21:02:43.627] Etherbase automatically configured address=0x8830397771710ADE101f0080f0da076181Bad374
  5. null
  6. > INFO [06-26|21:02:43.627] Commit new mining work number=1 sealhash=dac366ad5c8d uncles=0 txs=0 gas=0 fees=0 elapsed=373.028µs
  7. ##当我再次输入挖矿命令时,情况陷入了僵局,此时会一直停留在Commit new mining work
  8. ##我在网上搜索过许多,大多没有解决办法,也没有指出问题的原因,反反复复试过很多次,自第一次搭建私有链后,后续的都一直是这样。
  9. ##所以我打算在另一台电脑上安装虚拟机,重新再来一遍试试,而这个我也一直放着一直加载。
  10. ##当我在经过一系列猛如虎的操作下,装虚拟机,装ethereum开发环境,终于也到了加载DGA的那一步
  11. ##这时再看一直僵在Commit new mining work的电脑时,它突然开始挖矿了。。。。。
  12. ##所以到这个步骤时,并不是什么错误,我们应当耐心等待
  13.  
  14. > INFO [06-26|21:02:43.627] Commit new mining work number=1 sealhash=dac366ad5c8d uncles=0 txs=0 gas=0 fees=0 elapsed=373.028µs
  15. INFO [06-26|21:10:53.002] Successfully sealed new block number=1 sealhash=dac366ad5c8d hash=3cb840442e46 elapsed=8m9.375s
  16. INFO [06-26|21:10:53.042] ?? mined potential block number=1 hash=3cb840442e46
  17. INFO [06-26|21:10:53.103] Commit new mining work number=2 sealhash=08825466c59d uncles=0 txs=0 gas=0 fees=0 elapsed=60.592ms
  18. INFO [06-26|21:10:53.906] Successfully sealed new block number=2 sealhash=08825466c59d hash=44660293d76b elapsed=803.002ms
  19. INFO [06-26|21:10:53.906] ?? mined potential block number=2 hash=44660293d76b
  20. INFO [06-26|21:10:53.906] Commit new mining work number=3 sealhash=6c39db66d2bf uncles=0 txs=0 gas=0 fees=0 elapsed=178.137µs
  21. INFO [06-26|21:10:54.406] Successfully sealed new block number=3 sealhash=6c39db66d2bf hash=fa550b95d423 elapsed=500.446ms
  22. INFO [06-26|21:10:54.407] ?? mined potential block number=3 hash=fa550b95d423
  23. INFO [06-26|21:10:54.457] Commit new mining work number=4 sealhash=f170b2be929e uncles=0 txs=0 gas=0 fees=0 elapsed=50.737ms
  24. INFO [06-26|21:10:54.946] Successfully sealed new block number=4 sealhash=f170b2be929e hash=190e694fbc8b elapsed=488.870ms

查看挖到的区块

  1. 1 > miner.stop()
  2. 2 null
  3. 3 > eth.getBalance(eth.accounts[0])
  4. 4 155000000000000000000
  5. 5 > eth.blockNumber
  6. 6 31

到这里,一个基于以太坊的私有链就搭建完成了

原文链接:http://www.cnblogs.com/Falix/p/11095204.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号