当前位置:   article > 正文

以太坊搭建联盟链教程_以太坊联盟链搭建

以太坊联盟链搭建

Quorum是一种基于以太坊的分布式分类账协议,具有交易/合同隐私和新的共识机制。

Quorum是go-ethereum的一个分支,并根据go-ethereum发布进行更新。

go-ethereum的关键改进:

  • 隐私 - 仲裁通过公共/私有分离和利用Constellation支持私人交易和私人合同,Constellation是一种点对点加密消息交换,用于将私人数据定向传输给网络参与者
  • 替代共识机制 - 在许可网络中不需要POW / POS,Quorum提供了多种更适合联盟链的共识机制:
    • 基于Raft的共识 - 一种更快的阻塞时间,事务完成性和按需块创建的共识模型
    • Istanbul BFT - 由AMIS提供的具有交易终结性的PBFT启发的一致性算法。
  • 对等权限 - 使用智能合约进行节点/对等权限,确保只有已知方才能加入网络
  • 更高的性能 - Quorum提供比公共geth更高的性能

1. 首先,从github上下载Quorum

git clone https://github.com/jpmorganchase/quorum.git

下载成功后进入quorum文件夹在进行编译

make all

编译完成后会在bulid/bin文件下发现abigen bootnode  evm examples faucet geth p2psim puppeth rlpdump swarm wnode几个可执行文件 将它们添加到环境变量中即可 如export PATH=xxx/xxx/xxx/abigen:$PATH 

注意:如果电脑中已经安装了geth 再将上面的geth加入环境变量的话会出现冲突 可以改改名称(如geth1)或者把文件拷到需要运行的目录,然后把geth改成./geth就行了

2. 下载constellation-node 

wget https://github.com/jpmorganchase/constellation/releases/download/v0.3.1/constellation-0.3.1-ubuntu1604.tar.xz

我这里用的是0.3.1,版本不同可能会有一些不一样的地方,建议用我这个版本(用0.3.2之后的话不适用于本教程)

3. 下载用例教程 

这是官方提供的样例,部署七个节点。

git clone https://github.com/jpmorganchase/quorum-examples

4.基于raft机制搭建联盟链

(1)首先进行初始化,可以找到raft-init.sh这个脚本

  1. #!/bin/bash
  2. set -u
  3. set -e
  4. echo "[*] Cleaning up temporary data directories"
  5. rm -rf qdata
  6. mkdir -p qdata/logs
  7. echo "[*] Configuring node 1 (permissioned)"
  8. mkdir -p qdata/dd1/{keystore,geth}
  9. cp permissioned-nodes.json qdata/dd1/static-nodes.json
  10. cp permissioned-nodes.json qdata/dd1/
  11. cp keys/key1 qdata/dd1/keystore
  12. cp raft/nodekey1 qdata/dd1/geth/nodekey
  13. geth --datadir qdata/dd1 init genesis.json
  14. echo "[*] Configuring node 2 (permissioned)"
  15. mkdir -p qdata/dd2/{keystore,geth}
  16. cp permissioned-nodes.json qdata/dd2/static-nodes.json
  17. cp permissioned-nodes.json qdata/dd2/
  18. cp keys/key2 qdata/dd2/keystore
  19. cp raft/nodekey2 qdata/dd2/geth/nodekey
  20. geth --datadir qdata/dd2 init genesis.json
  21. echo "[*] Configuring node 3 (permissioned)"
  22. mkdir -p qdata/dd3/{keystore,geth}
  23. cp permissioned-nodes.json qdata/dd3/static-nodes.json
  24. cp permissioned-nodes.json qdata/dd3/
  25. cp keys/key6 qdata/dd3/keystore
  26. cp keys/key3 qdata/dd3/keystore
  27. cp raft/nodekey3 qdata/dd3/geth/nodekey
  28. geth --datadir qdata/dd3 init genesis.json
  29. echo "[*] Configuring node 4 (permissioned)"
  30. mkdir -p qdata/dd4/{keystore,geth}
  31. cp permissioned-nodes.json qdata/dd4/static-nodes.json
  32. cp permissioned-nodes.json qdata/dd4/
  33. cp keys/key4 qdata/dd4/keystore
  34. cp raft/nodekey4 qdata/dd4/geth/nodekey
  35. geth --datadir qdata/dd4 init genesis.json
  36. echo "[*] Configuring node 5"
  37. mkdir -p qdata/dd5/{keystore,geth}
  38. cp permissioned-nodes.json qdata/dd5/static-nodes.json
  39. cp keys/key5 qdata/dd5/keystore
  40. cp raft/nodekey5 qdata/dd5/geth/nodekey
  41. geth --datadir qdata/dd5 init genesis.json
  42. echo "[*] Configuring node 6"
  43. mkdir -p qdata/dd6/{keystore,geth}
  44. cp permissioned-nodes.json qdata/dd6/static-nodes.json
  45. cp raft/nodekey6 qdata/dd6/geth/nodekey
  46. cp keys/key7 qdata/dd6/keystore
  47. geth --datadir qdata/dd6 init genesis.json
  48. echo "[*] Configuring node 7"
  49. mkdir -p qdata/dd7/{keystore,geth}
  50. cp permissioned-nodes.json qdata/dd7/static-nodes.json
  51. cp raft/nodekey7 qdata/dd7/geth/nodekey
  52. cp keys/key8 qdata/dd7/keystore
  53. geth --datadir qdata/dd7 init genesis.json

这个脚本没啥坑 直接运行即可。

(2)启动联盟链,运行raft-start.sh这个脚本

  1. #!/bin/bash
  2. set -u
  3. set -e
  4. mkdir -p qdata/logs
  5. echo "[*] Starting Constellation nodes"
  6. ./constellation-start.sh
  7. echo "[*] Starting Ethereum nodes"
  8. set -v
  9. ARGS="--nodiscover --raft --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints"
  10. PRIVATE_CONFIG=qdata/c1/tm.ipc nohup geth --datadir qdata/dd1 $ARGS --permissioned --raftport 50401 --rpcport 22000 --port 21000 --unlock 0 --password passwords.txt 2>>qdata/logs/1.log &
  11. PRIVATE_CONFIG=qdata/c2/tm.ipc nohup geth --datadir qdata/dd2 $ARGS --permissioned --raftport 50402 --rpcport 22001 --port 21001 --unlock 0 --password passwords.txt 2>>qdata/logs/2.log &
  12. PRIVATE_CONFIG=qdata/c3/tm.ipc nohup geth --datadir qdata/dd3 $ARGS --permissioned --raftport 50403 --rpcport 22002 --port 21002 --unlock 0 --password passwords.txt 2>>qdata/logs/3.log &
  13. PRIVATE_CONFIG=qdata/c4/tm.ipc nohup geth --datadir qdata/dd4 $ARGS --permissioned --raftport 50404 --rpcport 22003 --port 21003 --unlock 0 --password passwords.txt 2>>qdata/logs/4.log &
  14. PRIVATE_CONFIG=qdata/c5/tm.ipc nohup geth --datadir qdata/dd5 $ARGS --raftport 50405 --rpcport 22004 --port 21004 --unlock 0 --password passwords.txt 2>>qdata/logs/5.log &
  15. PRIVATE_CONFIG=qdata/c6/tm.ipc nohup geth --datadir qdata/dd6 $ARGS --raftport 50406 --rpcport 22005 --port 21005 --unlock 0 --password passwords.txt 2>>qdata/logs/6.log &
  16. PRIVATE_CONFIG=qdata/c7/tm.ipc nohup geth --datadir qdata/dd7 $ARGS --raftport 50407 --rpcport 22006 --port 21006 --unlock 0 --password passwords.txt 2>>qdata/logs/7.log &
  17. set +v
  18. echo
  19. echo "All nodes configured. See 'qdata/logs' for logs, and run e.g. 'geth attach qdata/dd1/geth.ipc' to attach to the first Geth node."
  20. echo "To test sending a private transaction from Node 1 to Node 7, run './runscript.sh private-contract.js'"

注意到这个脚本中有constellation-start.sh这个脚本,不知道为什么我把constellation-node加入环境变量后也无法执行(可能是我电脑的原因?),如果你也遇到这个问题,就把之前下载的constellation-node拷到这个目录下,然后把下面脚本中的constellation-node改成./constellation-node就可以了。如果执行上面的raft-start.sh陷入死循环跳不出来的话,可以查看qdata/logs中的日志信息来寻找原因。正常执行成功的话是会输出最后那部分提示的(如下图)

constellation-start.sh:

  1. #!/bin/bash
  2. set -u
  3. set -e
  4. for i in {1..7}
  5. do
  6. DDIR="qdata/c$i"
  7. mkdir -p $DDIR
  8. mkdir -p qdata/logs
  9. cp "keys/tm$i.pub" "$DDIR/tm.pub"
  10. cp "keys/tm$i.key" "$DDIR/tm.key"
  11. rm -f "$DDIR/tm.ipc"
  12. CMD="constellation-node --url=https://127.0.0.$i:900$i/ --port=900$i --workdir=$DDIR --socket=tm.ipc --publickeys=tm.pub --privatekeys=tm.key --othernodes=https://127.0.0.1:9001/"
  13. echo "$CMD >> qdata/logs/constellation$i.log 2>&1 &"
  14. $CMD >> "qdata/logs/constellation$i.log" 2>&1 &
  15. done
  16. DOWN=true
  17. while $DOWN; do
  18. sleep 0.1
  19. DOWN=false
  20. for i in {1..7}
  21. do
  22. if [ ! -S "qdata/c$i/tm.ipc" ]; then
  23. DOWN=true
  24. fi
  25. done
  26. done

不出意外的话,到这里就基本上大功告成了,可以通过以下指令查看七个节点是否顺利运行,如果发现有七个进程在运行就证明已经成功了!只有一个的话就是失败了,得回去找问题。

  1. ps -ef | grep constellation-node
  2. ps -ef | grep geth

5.操作某个节点

geth attach qdata/dd1/geth.ipc

即可进入1号节点的控制台,基本操作跟geth是一样的,eth.accounts可以查看账号,钱包文件保存在7nodes/qdata/下的dd开头的七个文件夹中的keystore,然后再qdata/logs文件下会有1.log 到7.log ,1.log是主节点的挖矿信息,后面几个是1节点同步过去的信息,可以通过log来观察联盟链的事件。

至此,基本的七个节点就搭建起来了,下一节将结合具体项目来调用web3j!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/608440
推荐阅读
相关标签
  

闽ICP备14008679号