Quorum企业以太坊搭建区块链记录系列
1.第一个《Quorum企业以太坊环境搭建教程》
- 链接:Quorum企业以太坊环境搭建教程
- 注意事项:事先安装好docker和docker-compose;
$ git clone https://github.com/jpmorganchase/quorum-examples.git正克隆到 'quorum-examples'...remote: Enumerating objects: 52, done.remote: Counting objects: 100% (52/52), done.remote: Compressing objects: 100% (37/37), done.remote: Total 1464 (delta 23), reused 32 (delta 14), pack-reused 1412接收对象中: 100% (1464/1464), 449.31 KiB | 3.00 KiB/s, 完成.处理 delta 中: 100% (740/740), 完成.
$ cd quorum-examples/$ QUORUM_CONSENSUS=raft docker-compose up -dCreating network "quorum-examples-net" with driver "bridge"Creating volume "quorum-examples_vol1" with default driverCreating volume "quorum-examples_vol2" with default driverCreating volume "quorum-examples_vol3" with default driverCreating volume "quorum-examples_vol4" with default driverCreating volume "quorum-examples_vol5" with default driverCreating volume "quorum-examples_vol6" with default driverCreating volume "quorum-examples_vol7" with default driverCreating volume "quorum-examples_cakeshopvol" with default driverPulling txmanager1 (quorumengineering/tessera:0.10.6)...0.10.6: Pulling from quorumengineering/tesseradf20fa9351a1: Pull complete229610c13af7: Pull complete53a69ff98873: Pull complete9e5df38775f2: Pull completeDigest: sha256:4970e47b9abe289ef4957ad9c9fd289ddf7159e6116572bde9cf2462c074f399Status: Downloaded newer image for quorumengineering/tessera:0.10.6Pulling node1 (quorumengineering/quorum:2.6.0)...2.6.0: Pulling from quorumengineering/quorumcbdbe7a5bc2a: Pull complete8670dd5a125f: Pull complete4ab85e523a6a: Pull complete82deb08554a0: Pull completeDigest: sha256:947b24ace4106eb940e45a2683889e80a594819edc2ec99d5f552320482e4f6bStatus: Downloaded newer image for quorumengineering/quorum:2.6.0Pulling cakeshop (quorumengineering/cakeshop:0.11.0)...0.11.0: Pulling from quorumengineering/cakeshop50e431f79093: Pull completedd8c6d374ea5: Pull completec85513200d84: Pull complete55769680e827: Pull completee27ce2095ec2: Pull complete3eb0840c2dae: Pull complete491685d1af8c: Pull complete4980b616cdb2: Pull complete02c8d73a4499: Pull complete44563a8f7352: Pull completeDigest: sha256:738ab7f409064ca94ba14369e50db11d38eb25b8f494770def57fea45f296107Status: Downloaded newer image for quorumengineering/cakeshop:0.11.0Creating quorum-examples_txmanager6_1 ... doneCreating quorum-examples_txmanager3_1 ... doneCreating quorum-examples_txmanager5_1 ... doneCreating quorum-examples_txmanager1_1 ... doneCreating quorum-examples_txmanager7_1 ... doneCreating quorum-examples_txmanager4_1 ... doneCreating quorum-examples_cakeshop_1 ... doneCreating quorum-examples_txmanager2_1 ... doneCreating quorum-examples_node5_1 ... doneCreating quorum-examples_node3_1 ... doneCreating quorum-examples_node4_1 ... doneCreating quorum-examples_node7_1 ... doneCreating quorum-examples_node2_1 ... doneCreating quorum-examples_node6_1 ... doneCreating quorum-examples_node1_1 ... done
$ docker exec -it quorum-examples_node1_1 geth attach /qdata/dd/geth.ipc Welcome to the Geth JavaScript console!instance: Geth/node1-raft/v1.9.7-stable-9339be03(quorum-v2.6.0)/linux-amd64/go1.13.10coinbase: 0xed9d02e382b34818e88b88a309c7fe71e65f419dat block: 0 (Thu, 01 Jan 1970 00:00:00 UTC)datadir: /qdata/ddmodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0
> loadScript('/examples/private-contract.js')Contract transaction send: TransactionHash: 0x35feaf2d2d486eee40bad7907b0d59a6a1349c22d2a554824a994499dab3a0de waiting to be mined...true> Contract mined! Address: 0x1932c48b2bf8102ba33b4a6b545c32236e342f34[object Object]
再开节点2的客户端时:
$ docker exec -it quorum-examples_node2_1 geth attach /qdata/dd/geth.ipc Welcome to the Geth JavaScript console!instance: Geth/node2-raft/v1.9.7-stable-9339be03(quorum-v2.6.0)/linux-amd64/go1.13.10coinbase: 0xca843569e3427144cead5e4d5999a3d0ccf92b8eat block: 1 (Sat, 15 Aug 2020 17:45:22 UTC)datadir: /qdata/ddmodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0
接下来理论上:
> var abi=<Paste ABI here>;> var address="<paste Contract Address here>";> var contract=eth.contract(abi).at(address);>contract.get() //calling get() method0
但问题是abi如何获取?
2.第二个《以太坊联盟链quorum搭建(一)》
- 链接:以太坊联盟链quorum搭建(一)
- 第一步很慢
安装quorum:
git clone --recursive https://github.com/jpmorganchase/quorum.git
$ git clone --recursive https://github.com/jpmorganchase/quorum.git正克隆到 'quorum'...remote: Enumerating objects: 99305, done.remote: Total 99305 (delta 0), reused 0 (delta 0), pack-reused 99305接收对象中: 100% (99305/99305), 156.12 MiB | 27.00 KiB/s, 完成.处理 delta 中: 100% (68668/68668), 完成.子模组 'tests'(https://github.com/ethereum/tests)未对路径 'tests/testdata' 注册正克隆到 '/home/yanhao/quorum/tests/testdata'...remote: Enumerating objects: 2880, done. remote: Counting objects: 100% (2880/2880), done. remote: Compressing objects: 100% (280/280), done. error: RPC failed; curl 18 transfer closed with outstanding read data remainingfatal: The remote end hung up unexpectedlyfatal: 过早的文件结束符(EOF)fatal: index-pack 失败fatal: 无法克隆 'https://github.com/ethereum/tests' 到子模组路径 '/home/yanhao/quorum/tests/testdata'克隆 'tests/testdata' 失败。按计划重试正克隆到 '/home/yanhao/quorum/tests/testdata'...remote: Enumerating objects: 2880, done. remote: Counting objects: 100% (2880/2880), done. remote: Compressing objects: 100% (280/280), done. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end hung up unexpectedlyfatal: 过早的文件结束符(EOF)fatal: index-pack 失败fatal: 无法克隆 'https://github.com/ethereum/tests' 到子模组路径 '/home/yanhao/quorum/tests/testdata'第二次尝试克隆 'tests/testdata' 失败,退出
到这里有一定的错误,先继续进行。
$ cd quorum~/quorum$ make allbuild/env.sh go run build/ci.go installbuild/env.sh: 30: exec: go: not foundMakefile:24: recipe for target 'all' failedmake: *** [all] Error 127
依然存在错误,所以清除quorum之后重新git。
git clone一直失败。
3.官网https://docs.goquorum.consensys.net/en/latest/
- 20200818
yanhao@yanhao-ThinkPad-T480:~/quorum$ mkdir fromscratchyanhao@yanhao-ThinkPad-T480:~/quorum$ cd fromscratch/yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ mkdir new-node-1yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ geth --datadir new-node-1 account newINFO [08-18|23:21:16.043] Maximum peer count ETH=50 LES=0 total=50INFO [08-18|23:21:16.052] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"Your new account is locked with a password. Please give a password. Do not forget this password.Password: Repeat password: Your new key was generatedPublic address of the key: 0xBA67181B1b83386c707Bf9b063C964c486d57b7cPath of the secret key file: new-node-1/keystore/UTC--2020-08-18T15-22-00.476888534Z--ba67181b1b83386c707bf9b063c964c486d57b7c- You can share your public address with anyone. Others need it to interact with you.- You must NEVER share the secret key with anyone! The key controls access to your funds!- You must BACKUP your key file! Without the key, it's impossible to access account funds!- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ ls new-node-1/keystoreUTC--2020-08-18T15-22-00.476888534Z--ba67181b1b83386c707bf9b063c964c486d57b7cyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ vim genesis.jsonyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ bootnode --genkey=nodekeyyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ cp nodekey new-node-1yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ bootnode --nodekey=new-node-1/nodekey --writeaddress > new-node-1/enodeyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ cat new-node-1/enodea872bd0662d1afc0e2046e9cd441fc834941f4ed87bb9d1e382595e087fa829917d42f4790f69aa2f436628ceaabc794a10710a4d2adec3f37eba923bbd48a05yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ vim static-nodes.jsonyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ cp static-nodes.json new-node-1yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ geth --datadir new-node-1 init genesis.jsonINFO [08-18|23:35:44.101] Maximum peer count ETH=50 LES=0 total=50INFO [08-18|23:35:44.101] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"INFO [08-18|23:35:44.123] Allocated cache and file handles database=/home/yanhao/quorum/fromscratch/new-node-1/geth/chaindata cache=16.00MiB handles=16INFO [08-18|23:35:44.315] Writing custom genesis block INFO [08-18|23:35:44.315] Persisted trie from memory database nodes=1 size=152.00B time=163.328µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00BINFO [08-18|23:35:44.316] Successfully wrote genesis state database=chaindata hash=a1f478…305de6INFO [08-18|23:35:44.316] Allocated cache and file handles database=/home/yanhao/quorum/fromscratch/new-node-1/geth/lightchaindata cache=16.00MiB handles=16INFO [08-18|23:35:44.495] Writing custom genesis block INFO [08-18|23:35:44.496] Persisted trie from memory database nodes=1 size=152.00B time=197.181µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00BINFO [08-18|23:35:44.497] Successfully wrote genesis state database=lightchaindata hash=a1f478…305de6yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ vim startnode1.shyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ chmod +x startnode1.shyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ ./startnode1.shyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ geth attach new-node-1/geth.ipcFatal: Unable to attach to remote geth: dial unix new-node-1/geth.ipc: connect: no such file or directoryyanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch$ geth attach new-node-1/geth.ipcFatal: Unable to attach to remote geth: dial unix new-node-1/geth.ipc: connect: no such file or directory
到第九步链接到节点时报错。
geth attach new-node-1/geth.ipc
Fatal: Unable to attach to remote geth: dial unix new-node-1/geth.ipc: connect: no such file or directory
回头看找错,发现在第7步,忘记在enode后面加上端口号和IP等信息,即@127.0.0.1:21000?discport=0&raftport=50000。
依然报错。
- 20200819
同样的错误。 - 另外的:
Fatal: Failed to write genesis block: database contains incompatible genesis (have a1f4787986564357c63dc6a330555a13d7d1255f176fe34db41afe7bc7305de6, new 7bf5ab835f65dbe0c9a3acc82da7f2a2cd76e2018f8c3a616f1d8e9c06a75cf8)
4.联盟链Quorum(基于raft共识)部署流程(一)
链接:联盟链Quorum(基于raft共识)部署流程(一)
- 20200819
同样的结果:找不到ipc文件。
目前的搜索:
IPC文件只有在geth运行时才会存在。所以当开启geth时侯,才会出现geth.ipc。
通过查看node1.log日志文件,发现端口22001被占用:
Fatal: Error starting protocol stack: listen tcp 0.0.0.0:22001: bind: address already in use
于是通过下面的命令找到该进程并kill:
$ netstat -nap|grep 22001
tcp6 0 0 :::22001 :::* LISTEN 19738/docker-proxy
$ kill 19738
然后再重新运行即可:
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-new$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-new$ geth attach node1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0xebd5a70b86f838e963b71a44b2dde66656ddf2f2
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-new/node1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> raft.cluster
[]
但是其中的raft.cluster输出为空,目前不确定是否影响后面的执行。
接下来将node2添加为node1的peer,raft.cluster仍然为空;raft.addPeer成功返回了2。
在我们输入raft.addPeer得到了一个值“2”,这个是我们节点的raft ID值,这个值很重要,在我们编辑节点2的startnode2.sh文件时这是个重要参数。
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-new$ geth attach node1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0xebd5a70b86f838e963b71a44b2dde66656ddf2f2
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-new/node1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> raft.addPeer('enode://04b38095ff404e4421ed6c8a29d89fb41c796d6ff429d72c1de6c46a26bed473e5903c2bd1d9e261515c7082457d2866cf7a3173311f028ba7bd035397ee62f5@127.0.0.1:21002?discport=0&raftport=50002')
2
> raft.cluster
[]
>
5.重来一次官网的from scratch
- 第二步
yanhao@yanhao-ThinkPad-T480:~$ cd quorum
yanhao@yanhao-ThinkPad-T480:~/quorum$ mkdir fromscratch-again
yanhao@yanhao-ThinkPad-T480:~/quorum$ cd fromscratch-again/
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ mkdir new-node-1
- 第三步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth --datadir new-node-1 account new
INFO [08-19|17:38:18.308] Maximum peer count ETH=50 LES=0 total=50
INFO [08-19|17:38:18.308] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password: Your new key was generatedPublic address of the key: 0x03af8E050A5F40aec7a16EefeFD9082aa89c038a
Path of the secret key file: new-node-1/keystore/UTC--2020-08-19T09-38-25.001097925Z--03af8e050a5f40aec7a16eefefd9082aa89c038a- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls new-node-1/keystore
UTC--2020-08-19T09-38-25.001097925Z--03af8e050a5f40aec7a16eefefd9082aa89c038a
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth --datadir new-node-1 account new
INFO [08-19|17:39:36.962] Maximum peer count ETH=50 LES=0 total=50
INFO [08-19|17:39:36.963] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password: Your new key was generatedPublic address of the key: 0xE754B58a7147619D70B49DdeD8BdDfB2B66366B4
Path of the secret key file: new-node-1/keystore/UTC--2020-08-19T09-39-42.247894682Z--e754b58a7147619d70b49dded8bddfb2b66366b4- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls new-node-1/keystore
UTC--2020-08-19T09-38-25.001097925Z--03af8e050a5f40aec7a16eefefd9082aa89c038a
UTC--2020-08-19T09-39-42.247894682Z--e754b58a7147619d70b49dded8bddfb2b66366b4
- 第四步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim genesis.json
{"alloc": {"0x03af8e050a5f40aec7a16eefefd9082aa89c038a": {"balance": "1000000000000000000000000000"},"0xe754b58a7147619d70b49dded8bddfb2b66366b4": {"balance": "1000000000000000000000000000"}},"coinbase": "0x0000000000000000000000000000000000000000","config": {"homesteadBlock": 0,"byzantiumBlock": 0,"constantinopleBlock": 0,"chainId": 10,"eip150Block": 0,"eip155Block": 0,"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000","eip158Block": 0,"maxCodeSizeConfig": [{"block": 0,"size": 35}],"e754b58a7147619d70b49dded8bddfb2b66366b4isQuorum": true},"difficulty": "0x0","extraData": "0x0000000000000000000000000000000000000000000000000000000000000000","gasLimit": "0xE0000000","mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578","nonce": "0x0","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp": "0x00"
}
- 第五步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ bootnode --genkey=nodekey
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cp nodekey new-node-1
- 第六步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ bootnode --nodekey=new-node-1/nodekey --writeaddress > new-node-1/enode
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cat new-node-1/enode
5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165
- 第七步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim static-nodes.json
[
"enode://5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165@127.0.0.1:21000?discport=0&raftport=50000"
]
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cp static-nodes.json new-node-1
- 第八步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth --datadir new-node-1 init genesis.json
INFO [08-19|17:54:41.105] Maximum peer count ETH=50 LES=0 total=50
INFO [08-19|17:54:41.105] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [08-19|17:54:41.107] Allocated cache and file handles database=/home/yanhao/quorum/fromscratch-again/new-node-1/geth/chaindata cache=16.00MiB handles=16
INFO [08-19|17:54:41.337] Writing custom genesis block
INFO [08-19|17:54:41.338] Persisted trie from memory database nodes=3 size=417.00B time=191.772µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [08-19|17:54:41.339] Successfully wrote genesis state database=chaindata hash=8fda1d…12de4d
INFO [08-19|17:54:41.339] Allocated cache and file handles database=/home/yanhao/quorum/fromscratch-again/new-node-1/geth/lightchaindata cache=16.00MiB handles=16
INFO [08-19|17:54:41.662] Writing custom genesis block
INFO [08-19|17:54:41.663] Persisted trie from memory database nodes=3 size=417.00B time=188.832µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [08-19|17:54:41.663] Successfully wrote genesis state database=lightchaindata hash=8fda1d…12de4d
- 第九步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
PRIVATE_CONFIG=ignore nohup geth --datadir new-node-1 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50000 --rpc --rpcaddr 0.0.0.0 --rpcport 22000 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21000 >> node.log 2>&1 &
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ chmod +x startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
确认ipc文件存在:
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-1/
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1$ ls
enode geth.ipc nodekey raft-snap static-nodes.json
geth keystore quorum-raft-state raft-wal
- 第十步
终于成功了!!!
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> raft
{cluster: [{hostname: "127.0.0.1",nodeActive: true,nodeId: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",p2pPort: 21000,raftId: 1,raftPort: 50000,role: "minter"}],leader: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",role: "minter",addLearner: function(),addPeer: function(),getCluster: function(callback),getLeader: function(callback),getRole: function(callback),promoteToPeer: function(),removePeer: function()
}
> raft.cluster
[{hostname: "127.0.0.1",nodeActive: true,nodeId: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",p2pPort: 21000,raftId: 1,raftPort: 50000,role: "minter"
}]
>
添加其他节点(移除节点暂时不做)
- 第一步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ mkdir new-node-2
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ bootnode --genkey=nodekey2
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cp nodekey2 new-node-2/nodekey
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ bootnode --nodekey=new-node-2/nodekey --writeaddress
6f117ba6c467ce4164dcd02b74f07720b61b5cdef8ef061eeddcbffcb8e2a94fe881f0045dcd4b61ae0653663d81bfc7eadf92f61110c38c80e423820d594804
- 第二步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cp static-nodes.json new-node-2
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim new-node-2/static-nodes.json
["enode://5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165@127.0.0.1:21000?discport=0&raftport=50000", "enode://6f117ba6c467ce4164dcd02b74f07720b61b5cdef8ef061eeddcbffcb8e2a94fe881f0045dcd4b61ae0653663d81bfc7eadf92f61110c38c80e423820d594804@127.0.0.1:21001?discport=0&raftport=50001"
]
- 第三步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth --datadir new-node-2 init genesis.json
INFO [08-19|18:14:33.932] Maximum peer count ETH=50 LES=0 total=50
INFO [08-19|18:14:33.932] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [08-19|18:14:33.933] Allocated cache and file handles database=/home/yanhao/quorum/fromscratch-again/new-node-2/geth/chaindata cache=16.00MiB handles=16
INFO [08-19|18:14:34.134] Writing custom genesis block
INFO [08-19|18:14:34.135] Persisted trie from memory database nodes=3 size=417.00B time=183.852µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [08-19|18:14:34.135] Successfully wrote genesis state database=chaindata hash=8fda1d…12de4d
INFO [08-19|18:14:34.136] Allocated cache and file handles database=/home/yanhao/quorum/fromscratch-again/new-node-2/geth/lightchaindata cache=16.00MiB handles=16
INFO [08-19|18:14:34.436] Writing custom genesis block
INFO [08-19|18:14:34.437] Persisted trie from memory database nodes=3 size=417.00B time=159.152µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [08-19|18:14:34.437] Successfully wrote genesis state database=lightchaindata hash=8fda1d…12de4d
- 第四步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> raft
{cluster: [{hostname: "127.0.0.1",nodeActive: true,nodeId: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",p2pPort: 21000,raftId: 1,raftPort: 50000,role: "minter"}],leader: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",role: "minter",addLearner: function(),addPeer: function(),getCluster: function(callback),getLeader: function(callback),getRole: function(callback),promoteToPeer: function(),removePeer: function()
}
> raft.addPeer('enode://6f117ba6c467ce4164dcd02b74f07720b61b5cdef8ef061eeddcbffcb8e2a94fe881f0045dcd4b61ae0653663d81bfc7eadf92f61110c38c80e423820d594804@127.0.0.1:21001?discport=0&raftport=50001')
2
> raft.cluster[{hostname: "127.0.0.1",nodeActive: false,nodeId: "6f117ba6c467ce4164dcd02b74f07720b61b5cdef8ef061eeddcbffcb8e2a94fe881f0045dcd4b61ae0653663d81bfc7eadf92f61110c38c80e423820d594804",p2pPort: 21001,raftId: 2,raftPort: 50001,role: "verifier"
}, {hostname: "127.0.0.1",nodeActive: true,nodeId: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",p2pPort: 21000,raftId: 1,raftPort: 50000,role: "minter"
}]
>
- 第五步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cp startnode1.sh startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
PRIVATE_CONFIG=ignore nohup geth --datadir new-node-2 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50001 --raftjoinexisting 2 --rpc --rpcaddr 0.0.0.0 --rpcport 22001 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21001 2>>node2.log &
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json new-node-1 new-node-2 node2.log nodekey nodekey2 node.log nohup.out startnode1.sh startnode2.sh static-nodes.json
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-2
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2$ ls
geth geth.ipc keystore nodekey quorum-raft-state raft-snap raft-wal static-nodes.json
- 第六步
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cp new-node-2/static-nodes.json new-node-1
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-2/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-2modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> raft
{cluster: [{hostname: "127.0.0.1",nodeActive: true,nodeId: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",p2pPort: 21000,raftId: 1,raftPort: 50000,role: "minter"}, {hostname: "127.0.0.1",nodeActive: true,nodeId: "6f117ba6c467ce4164dcd02b74f07720b61b5cdef8ef061eeddcbffcb8e2a94fe881f0045dcd4b61ae0653663d81bfc7eadf92f61110c38c80e423820d594804",p2pPort: 21001,raftId: 2,raftPort: 50001,role: "verifier"}],leader: "5974b603488f3bfcf117b34dca2106100c1d6986f8859e08e72827ad075aa7791869c073dcbb01335b918e7938f12c05eb6455faa05be44f4aea324c99f8f165",role: "verifier",addLearner: function(),addPeer: function(),getCluster: function(callback),getLeader: function(callback),getRole: function(callback),promoteToPeer: function(),removePeer: function()
}
> exit
添加隐私交易管理器
第一步:下载并准备环境
yanhao@yanhao-ThinkPad-T480:~$ ls
examples.desktop quorum 模板 文档 桌面
go quorum-examples 视频 下载
go1.12.6.linux-amd64.tar.gz 公共的 图片 音乐
yanhao@yanhao-ThinkPad-T480:~$ cd quorum
yanhao@yanhao-ThinkPad-T480:~/quorum$ ls
accounts COPYING event Makefile raft
appveyor.yml COPYING.LESSER extension metrics README.md
AUTHORS core fromscratch miner rlp
build crypto fromscratch-again mkdocs.yml rpc
BUILDING.md dashboard fromscratch-new mobile SECURITY.md
circle.yml Dockerfile graphql node signer
cmd Dockerfile.alltools interfaces.go NOTES.md tests
common docs internal p2p trie
consensus eth les params vendor
console ethclient light permission whisper
containers ethdb log plugin
contracts ethstats logo.png private
yanhao@yanhao-ThinkPad-T480:~/quorum$ cd fromscratch-again/
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json nodekey startnode1.sh tessera-app-0.10.6-app.jar
new-node-1 nodekey2 startnode2.sh
new-node-2 node.log static-nodes.json
node2.log nohup.out tessera-app-0.10.4-app.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ mv tessera-app-0.10.4-app.jar tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json node2.log node.log startnode2.sh tessera.jar
new-node-1 nodekey nohup.out static-nodes.json
new-node-2 nodekey2 startnode1.sh tessera-app-0.10.6-app.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ mkdir new-node-1t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json node2.log nohup.out tessera-app-0.10.6-app.jar
new-node-1 nodekey startnode1.sh tessera.jar
new-node-1t nodekey2 startnode2.sh
new-node-2 node.log static-nodes.json
第二步:生成新密钥
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-1t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ java -jar ../tessera.jar -keygen -filename new-node-1Command 'java' not found, but can be installed with:sudo apt install default-jre
sudo apt install openjdk-11-jre-headless
sudo apt install openjdk-8-jre-headless
缺少java环境,进行安装
一通操作之后,成功了
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ sudo apt install default-jre
[sudo] yanhao 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:linux-headers-5.0.0-37 linux-headers-5.0.0-37-genericlinux-image-5.0.0-37-generic linux-modules-5.0.0-37-genericlinux-modules-extra-5.0.0-37-generic
使用'sudo apt autoremove'来卸载它(它们)。
将会同时安装下列软件:ca-certificates-java default-jre-headless fonts-dejavu-extra java-commonlibatk-wrapper-java libatk-wrapper-java-jni libgif7 openjdk-11-jreopenjdk-11-jre-headless
建议安装:fonts-ipafont-gothic fonts-ipafont-mincho fonts-wqy-microhei| fonts-wqy-zenhei
下列【新】软件包将被安装:ca-certificates-java default-jre default-jre-headless fonts-dejavu-extrajava-common libatk-wrapper-java libatk-wrapper-java-jni libgif7openjdk-11-jre openjdk-11-jre-headless
升级了 0 个软件包,新安装了 10 个软件包,要卸载 0 个软件包,有 144 个软件包未被升级。
需要下载 39.7 MB 的归档。
解压缩后会消耗 179 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 java-common all 0.68ubuntu1~18.04.1 [14.5 kB]
获取:2 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 openjdk-11-jre-headless amd64 11.0.8+10-0ubuntu1~18.04.1 [37.6 MB]
获取:3 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 default-jre-headless amd64 2:1.11-68ubuntu1~18.04.1 [10.9 kB]
获取:4 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 ca-certificates-java all 20180516ubuntu1~18.04.1 [12.2 kB]
获取:5 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libgif7 amd64 5.1.4-2ubuntu0.1 [30.9 kB]
获取:6 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 openjdk-11-jre amd64 11.0.8+10-0ubuntu1~18.04.1 [34.4 kB]
获取:7 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 default-jre amd64 2:1.11-68ubuntu1~18.04.1 [1,076 B]
获取:8 http://cn.archive.ubuntu.com/ubuntu bionic/main amd64 fonts-dejavu-extra all 2.37-1 [1,953 kB]
获取:9 http://cn.archive.ubuntu.com/ubuntu bionic/main amd64 libatk-wrapper-java all 0.33.3-20ubuntu0.1 [34.7 kB]
获取:10 http://cn.archive.ubuntu.com/ubuntu bionic/main amd64 libatk-wrapper-java-jni amd64 0.33.3-20ubuntu0.1 [28.3 kB]
已下载 39.7 MB,耗时 41分 22秒 (16.0 kB/s)
正在选中未选择的软件包 java-common。
(正在读取数据库 ... 系统当前共安装有 209992 个文件和目录。)
正准备解包 .../0-java-common_0.68ubuntu1~18.04.1_all.deb ...
正在解包 java-common (0.68ubuntu1~18.04.1) ...
正在选中未选择的软件包 openjdk-11-jre-headless:amd64。
正准备解包 .../1-openjdk-11-jre-headless_11.0.8+10-0ubuntu1~18.04.1_amd64.deb ...
正在解包 openjdk-11-jre-headless:amd64 (11.0.8+10-0ubuntu1~18.04.1) ...
正在选中未选择的软件包 default-jre-headless。
正准备解包 .../2-default-jre-headless_2%3a1.11-68ubuntu1~18.04.1_amd64.deb ...
正在解包 default-jre-headless (2:1.11-68ubuntu1~18.04.1) ...
正在选中未选择的软件包 ca-certificates-java。
正准备解包 .../3-ca-certificates-java_20180516ubuntu1~18.04.1_all.deb ...
正在解包 ca-certificates-java (20180516ubuntu1~18.04.1) ...
正在选中未选择的软件包 libgif7:amd64。
正准备解包 .../4-libgif7_5.1.4-2ubuntu0.1_amd64.deb ...
正在解包 libgif7:amd64 (5.1.4-2ubuntu0.1) ...
正在选中未选择的软件包 openjdk-11-jre:amd64。
正准备解包 .../5-openjdk-11-jre_11.0.8+10-0ubuntu1~18.04.1_amd64.deb ...
正在解包 openjdk-11-jre:amd64 (11.0.8+10-0ubuntu1~18.04.1) ...
正在选中未选择的软件包 default-jre。
正准备解包 .../6-default-jre_2%3a1.11-68ubuntu1~18.04.1_amd64.deb ...
正在解包 default-jre (2:1.11-68ubuntu1~18.04.1) ...
正在选中未选择的软件包 fonts-dejavu-extra。
正准备解包 .../7-fonts-dejavu-extra_2.37-1_all.deb ...
正在解包 fonts-dejavu-extra (2.37-1) ...
正在选中未选择的软件包 libatk-wrapper-java。
正准备解包 .../8-libatk-wrapper-java_0.33.3-20ubuntu0.1_all.deb ...
正在解包 libatk-wrapper-java (0.33.3-20ubuntu0.1) ...
正在选中未选择的软件包 libatk-wrapper-java-jni:amd64。
正准备解包 .../9-libatk-wrapper-java-jni_0.33.3-20ubuntu0.1_amd64.deb ...
正在解包 libatk-wrapper-java-jni:amd64 (0.33.3-20ubuntu0.1) ...
正在处理用于 mime-support (3.60ubuntu1) 的触发器 ...
正在处理用于 desktop-file-utils (0.23-1ubuntu3.18.04.2) 的触发器 ...
正在设置 java-common (0.68ubuntu1~18.04.1) ...
正在设置 libgif7:amd64 (5.1.4-2ubuntu0.1) ...
正在处理用于 libc-bin (2.27-3ubuntu1.2) 的触发器 ...
正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 ...
正在处理用于 gnome-menus (3.13.3-11ubuntu1.1) 的触发器 ...
正在设置 fonts-dejavu-extra (2.37-1) ...
正在处理用于 ca-certificates (20190110~18.04.1) 的触发器 ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
正在设置 libatk-wrapper-java (0.33.3-20ubuntu0.1) ...
正在处理用于 hicolor-icon-theme (0.17-2) 的触发器 ...
正在处理用于 fontconfig (2.12.6-0ubuntu2) 的触发器 ...
正在设置 libatk-wrapper-java-jni:amd64 (0.33.3-20ubuntu0.1) ...
正在设置 openjdk-11-jre-headless:amd64 (11.0.8+10-0ubuntu1~18.04.1) ...
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/rmid 来在自动模式中提供 /usr/bin/rmid (rmid)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 来在自动模式中提供 /usr/bin/java (java)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool 来在自动模式中提供 /usr/bin/keytool (keytool)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/jjs 来在自动模式中提供 /usr/bin/jjs (jjs)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/pack200 来在自动模式中提供 /usr/bin/pack200 (pack200)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/rmiregistry 来在自动模式中提供 /usr/bin/rmiregistry (rmiregistry)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/unpack200 来在自动模式中提供 /usr/bin/unpack200 (unpack200)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/bin/jfr 来在自动模式中提供 /usr/bin/jfr (jfr)
update-alternatives: 使用 /usr/lib/jvm/java-11-openjdk-amd64/lib/jexec 来在自动模式中提供 /usr/bin/jexec (jexec)
正在设置 default-jre-headless (2:1.11-68ubuntu1~18.04.1) ...
正在设置 openjdk-11-jre:amd64 (11.0.8+10-0ubuntu1~18.04.1) ...
正在设置 ca-certificates-java (20180516ubuntu1~18.04.1) ...
head: 无法打开'/etc/ssl/certs/java/cacerts' 读取数据: 没有那个文件或目录
Adding debian:T-TeleSec_GlobalRoot_Class_2.pem
Adding debian:Microsec_e-Szigno_Root_CA_2009.pem
Adding debian:IdenTrust_Commercial_Root_CA_1.pem
Adding debian:TWCA_Root_Certification_Authority.pem
Adding debian:VeriSign_Class_3_Public_Primary_Certification_Authority_-_G4.pem
Adding debian:Baltimore_CyberTrust_Root.pem
Adding debian:T-TeleSec_GlobalRoot_Class_3.pem
Adding debian:Deutsche_Telekom_Root_CA_2.pem
Adding debian:GeoTrust_Primary_Certification_Authority_-_G2.pem
Adding debian:ssl-cert-snakeoil.pem
Adding debian:OISTE_WISeKey_Global_Root_GA_CA.pem
Adding debian:Buypass_Class_2_Root_CA.pem
Adding debian:Atos_TrustedRoot_2011.pem
Adding debian:DigiCert_Global_Root_G3.pem
Adding debian:GlobalSign_Root_CA_-_R3.pem
Adding debian:SecureSign_RootCA11.pem
Adding debian:VeriSign_Universal_Root_Certification_Authority.pem
Adding debian:COMODO_Certification_Authority.pem
Adding debian:Sonera_Class_2_Root_CA.pem
Adding debian:GlobalSign_Root_CA.pem
Adding debian:Certum_Trusted_Network_CA_2.pem
Adding debian:SSL.com_EV_Root_Certification_Authority_RSA_R2.pem
Adding debian:QuoVadis_Root_CA_3.pem
Adding debian:GlobalSign_Root_CA_-_R2.pem
Adding debian:Entrust_Root_Certification_Authority_-_EC1.pem
Adding debian:TrustCor_RootCert_CA-2.pem
Adding debian:CFCA_EV_ROOT.pem
Adding debian:certSIGN_ROOT_CA.pem
Adding debian:Cybertrust_Global_Root.pem
Adding debian:GlobalSign_Root_CA_-_R6.pem
Adding debian:GlobalSign_ECC_Root_CA_-_R4.pem
Adding debian:Security_Communication_Root_CA.pem
Adding debian:GeoTrust_Primary_Certification_Authority_-_G3.pem
Adding debian:COMODO_RSA_Certification_Authority.pem
Adding debian:COMODO_ECC_Certification_Authority.pem
Adding debian:TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.pem
Adding debian:Izenpe.com.pem
Adding debian:Certplus_Class_2_Primary_CA.pem
Adding debian:ISRG_Root_X1.pem
Adding debian:QuoVadis_Root_CA_2_G3.pem
Adding debian:Security_Communication_RootCA2.pem
Adding debian:TrustCor_RootCert_CA-1.pem
Adding debian:CA_Disig_Root_R2.pem
Adding debian:Entrust.net_Premium_2048_Secure_Server_CA.pem
Adding debian:DigiCert_High_Assurance_EV_Root_CA.pem
Adding debian:EE_Certification_Centre_Root_CA.pem
Adding debian:Amazon_Root_CA_2.pem
Adding debian:Comodo_AAA_Services_root.pem
Adding debian:GDCA_TrustAUTH_R5_ROOT.pem
Adding debian:AffirmTrust_Networking.pem
Adding debian:SZAFIR_ROOT_CA2.pem
Adding debian:Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.pem
Adding debian:OISTE_WISeKey_Global_Root_GB_CA.pem
Adding debian:Entrust_Root_Certification_Authority_-_G2.pem
Adding debian:SSL.com_Root_Certification_Authority_ECC.pem
Adding debian:DigiCert_Assured_ID_Root_G2.pem
Adding debian:DigiCert_Assured_ID_Root_CA.pem
Adding debian:AffirmTrust_Premium.pem
Adding debian:Certum_Trusted_Network_CA.pem
Adding debian:DigiCert_Global_Root_CA.pem
Adding debian:Entrust_Root_Certification_Authority.pem
Adding debian:Starfield_Root_Certificate_Authority_-_G2.pem
Adding debian:Starfield_Class_2_CA.pem
Adding debian:Amazon_Root_CA_1.pem
Adding debian:Secure_Global_CA.pem
Adding debian:EC-ACC.pem
Adding debian:Taiwan_GRCA.pem
Adding debian:OISTE_WISeKey_Global_Root_GC_CA.pem
Adding debian:Go_Daddy_Class_2_CA.pem
Adding debian:GeoTrust_Universal_CA_2.pem
Adding debian:AffirmTrust_Commercial.pem
Adding debian:SSL.com_EV_Root_Certification_Authority_ECC.pem
Adding debian:DigiCert_Trusted_Root_G4.pem
Adding debian:DigiCert_Global_Root_G2.pem
Adding debian:Trustis_FPS_Root_CA.pem
Adding debian:GeoTrust_Universal_CA.pem
Adding debian:Hellenic_Academic_and_Research_Institutions_RootCA_2015.pem
Adding debian:ACCVRAIZ1.pem
Adding debian:Verisign_Class_3_Public_Primary_Certification_Authority_-_G3.pem
Adding debian:SecureTrust_CA.pem
Adding debian:GlobalSign_ECC_Root_CA_-_R5.pem
Adding debian:Go_Daddy_Root_Certificate_Authority_-_G2.pem
Adding debian:VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.pem
Adding debian:D-TRUST_Root_Class_3_CA_2_EV_2009.pem
Adding debian:E-Tugra_Certification_Authority.pem
Adding debian:Hellenic_Academic_and_Research_Institutions_RootCA_2011.pem
Adding debian:IdenTrust_Public_Sector_Root_CA_1.pem
Adding debian:ePKI_Root_Certification_Authority.pem
Adding debian:LuxTrust_Global_Root_2.pem
Adding debian:Buypass_Class_3_Root_CA.pem
Adding debian:QuoVadis_Root_CA_3_G3.pem
Adding debian:Certigna.pem
Adding debian:Staat_der_Nederlanden_EV_Root_CA.pem
Adding debian:NetLock_Arany_=Class_Gold=_Főtanúsítvány.pem
Adding debian:Chambers_of_Commerce_Root_-_2008.pem
Adding debian:TWCA_Global_Root_CA.pem
Adding debian:Starfield_Services_Root_Certificate_Authority_-_G2.pem
Adding debian:TeliaSonera_Root_CA_v1.pem
Adding debian:thawte_Primary_Root_CA_-_G2.pem
Adding debian:Amazon_Root_CA_3.pem
Adding debian:SSL.com_Root_Certification_Authority_RSA.pem
Adding debian:DST_Root_CA_X3.pem
Adding debian:USERTrust_RSA_Certification_Authority.pem
Adding debian:thawte_Primary_Root_CA.pem
Adding debian:USERTrust_ECC_Certification_Authority.pem
Adding debian:Staat_der_Nederlanden_Root_CA_-_G3.pem
Adding debian:Certinomis_-_Root_CA.pem
Adding debian:GeoTrust_Global_CA.pem
Adding debian:AffirmTrust_Premium_ECC.pem
Adding debian:Network_Solutions_Certificate_Authority.pem
Adding debian:XRamp_Global_CA_Root.pem
Adding debian:Global_Chambersign_Root_-_2008.pem
Adding debian:SwissSign_Gold_CA_-_G2.pem
Adding debian:Hongkong_Post_Root_CA_1.pem
Adding debian:QuoVadis_Root_CA_1_G3.pem
Adding debian:Actalis_Authentication_Root_CA.pem
Adding debian:Hellenic_Academic_and_Research_Institutions_ECC_RootCA_2015.pem
Adding debian:DigiCert_Assured_ID_Root_G3.pem
Adding debian:QuoVadis_Root_CA_2.pem
Adding debian:GeoTrust_Primary_Certification_Authority.pem
Adding debian:Amazon_Root_CA_4.pem
Adding debian:QuoVadis_Root_CA.pem
Adding debian:Staat_der_Nederlanden_Root_CA_-_G2.pem
Adding debian:AC_RAIZ_FNMT-RCM.pem
Adding debian:TrustCor_ECA-1.pem
Adding debian:SwissSign_Silver_CA_-_G2.pem
Adding debian:thawte_Primary_Root_CA_-_G3.pem
Adding debian:D-TRUST_Root_Class_3_CA_2_2009.pem
done.
正在设置 default-jre (2:1.11-68ubuntu1~18.04.1) ...
正在处理用于 libc-bin (2.27-3ubuntu1.2) 的触发器 ...
正在处理用于 ca-certificates (20190110~18.04.1) 的触发器 ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...done.
done.
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ java -jar ../tessera.jar -keygen -filename new-node-1
Error: Invalid or corrupt jarfile ../tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ ls
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ java -jar ./tessera.jar -keygen -filename new-node-1
Error: Unable to access jarfile ./tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ cd ..
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json node2.log nohup.out tessera-app-0.10.6-app.jar
new-node-1 nodekey startnode1.sh tessera.jar
new-node-1t nodekey2 startnode2.sh
new-node-2 node.log static-nodes.json
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ^C
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ mv tessera-app-0.10.6-app.jar tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json new-node-2 nodekey2 startnode1.sh tessera.jar
new-node-1 node2.log node.log startnode2.sh
new-node-1t nodekey nohup.out static-nodes.json
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ java -jar ../tessera.jar -keygen -filename new-node-1
Error: Unable to access jarfile ../tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json new-node-2 nodekey2 startnode1.sh tessera.jar
new-node-1 node2.log node.log startnode2.sh
new-node-1t nodekey nohup.out static-nodes.json
不设置密码,为空直接回车
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-1t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ java -jar ../tessera.jar -keygen -filename new-node-1
Enter a password if you want to lock the private key or leave blankPlease re-enter the password (or lack of) to confirm2020-09-04 12:03:43.962 [main] INFO com.quorum.tessera.nacl.jnacl.Jnacl - Generating new keypair...
2020-09-04 12:03:44.007 [main] INFO com.quorum.tessera.nacl.jnacl.Jnacl - Generated new key pair with public key PublicKey[aVgqwifKUksF0QSdj60eTXWiQWB1YUKcRUytRs0lQwc=]
2020-09-04 12:03:44.425 [main] INFO c.q.t.k.generation.FileKeyGenerator - Saved public key to /home/yanhao/quorum/fromscratch-again/new-node-1t/new-node-1.pub
2020-09-04 12:03:44.425 [main] INFO c.q.t.k.generation.FileKeyGenerator - Saved private key to /home/yanhao/quorum/fromscratch-again/new-node-1t/new-node-1.key
引用新生成的密钥创建配置文件
vim config.json
{"useWhiteList": false,"jdbc": {"username": "sa","password": "","url": "jdbc:h2:/home/yanhao/quorum/fromscratch-again/new-node-1t/db1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=0","autoCreateTables": true},"serverConfigs":[{"app":"ThirdParty","enabled": true,"serverAddress": "http://localhost:9081","communicationType" : "REST"},{"app":"Q2T","enabled": true,"serverAddress":"unix:/home/yanhao/quorum/fromscratch-again/new-node-1t/tm.ipc","communicationType" : "REST"},{"app":"P2P","enabled": true,"serverAddress":"http://localhost:9001","sslConfig": {"tls": "OFF"},"communicationType" : "REST"}],"peer": [{"url": "http://localhost:9001"},{"url": "http://localhost:9003"}],"keys": {"passwords": [],"keyData": [{"privateKeyPath": "/home/yanhao/quorum/fromscratch-again/new-node-1t/new-node-1.key","publicKeyPath": "/home/yanhao/quorum/fromscratch-again/new-node-1t/new-node-1.pub"}]},"alwaysSendTo": []
}
创建第二个tessera节点
同样不设置密码,直接回车
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ cd ..
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ mkdir new-node-2t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-2t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ java -jar ../tessera.jar -keygen -filename new-node-2
Enter a password if you want to lock the private key or leave blankPlease re-enter the password (or lack of) to confirm2020-09-08 19:50:21.578 [main] INFO com.quorum.tessera.nacl.jnacl.Jnacl - Generating new keypair...
2020-09-08 19:50:21.679 [main] INFO com.quorum.tessera.nacl.jnacl.Jnacl - Generated new key pair with public key PublicKey[26vwr5wxV0HMhVBkdCcQOMLH0KVYPla8R+FS3Np+/T8=]
2020-09-08 19:50:23.362 [main] INFO c.q.t.k.generation.FileKeyGenerator - Saved public key to /home/yanhao/quorum/fromscratch-again/new-node-2t/new-node-2.pub
2020-09-08 19:50:23.363 [main] INFO c.q.t.k.generation.FileKeyGenerator - Saved private key to /home/yanhao/quorum/fromscratch-again/new-node-2t/new-node-2.key
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ cp ../new-node-1t/config.json
cp: 在'../new-node-1t/config.json' 后缺少了要操作的目标文件
Try 'cp --help' for more information.
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ cp ../new-node-1t/config.json .
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ ls
config.json new-node-2.key new-node-2.pub
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ vim config.json
创建配置文件,类似与new-node-1t
{"useWhiteList": false,"jdbc": {"username": "sa","password": "","url": "jdbc:h2:/home/yanhao/quorum/fromscratch-again/new-node-2t/db1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=0","autoCreateTables": true},"serverConfigs":[{"app":"ThirdParty","enabled": true,"serverAddress": "http://localhost:9083","communicationType" : "REST"},{"app":"Q2T","enabled": true,"serverAddress":"unix:/home/yanhao/quorum/fromscratch-again/new-node-2t/tm.ipc","communicationType" : "REST"},{"app":"P2P","enabled": true,"serverAddress":"http://localhost:9003","sslConfig": {"tls": "OFF"},"communicationType" : "REST"}],"peer": [{"url": "http://localhost:9001"},{"url": "http://localhost:9003"}],"keys": {"passwords": [],"keyData": [{"privateKeyPath": "/home/yanhao/quorum/fromscratch-again/new-node-2t/new-node-2.key","publicKeyPath": "/home/yanhao/quorum/fromscratch-again/new-node-2t/new-node-2.pub"}]},"alwaysSendTo": []
}
第五步:启动Tessera节点,然后发送到后台
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ java -jar ../tessera.jar -configfile config.json >> tessera.log 2>&1 &
[1] 17165
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ cd ../new-node-1t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ java -jar ../tessera.jar -configfile config.json >> tessera.log 2>&1 &
[2] 17941
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:00:17 java
17941 pts/1 00:00:16 java
18142 pts/1 00:00:00 ps
第六步:从上方启动连接到正在运行的Tessera节点的GoQuorum节点并将其发送到后台
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ cd ..
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json new-node-1 new-node-1t new-node-2 new-node-2t node2.log nodekey nodekey2 node.log nohup.out startnode1.sh startnode2.sh static-nodes.json tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
startnode1.sh
PRIVATE_CONFIG=/home/yanhao/quorum/fromscratch-again/new-node-1t/tm.ipc nohup geth --datadir new-node-1 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50000 --rpc --rpcaddr 0.0.0.0 --rpcport 22000 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21000 >> node.log 2>&1 &
startnode2.sh
PRIVATE_CONFIG=/home/yanhao/quorum/fromscratch-again/new-node-1t/tm.ipc nohup geth --datadir new-node-2 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50001 --raftjoinexisting 2 --rpc --rpcaddr 0.0.0.0 --rpcport 22001 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21001 2>>node2.log &
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:00:31 java
17941 pts/1 00:00:33 java
30059 pts/1 00:00:00 geth
30147 pts/1 00:00:00 geth
30241 pts/1 00:00:00 ps
节点现在可以运行(可操作),可以使用(geth attach new-node-1/geth.ipc)链接(attach)到该节点以发送私人交易
vim private-contract.js
//创建简单的私有合约,以从新节点1发送私有交易,以获取步骤四中创建的新节点2的tessera公钥
a = eth.accounts[0]
web3.eth.defaultAccount = a;// abi and bytecode generated from simplestorage.sol:
// > solcjs --bin --abi simplestorage.sol
var abi = [{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"initVal","type":"uint256"}],"payable":false,"type":"constructor"}];var bytecode = "0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029";var simpleContract = web3.eth.contract(abi);
var simple = simpleContract.new(42, {from:web3.eth.accounts[0], data: bytecode, gas: 0x47b760, privateFor: ["AeggpVlVsi+rxD6h9tcq/8qL/MsjyipUnkj1nvNPgTU="]}, function(e, contract) {if (e) {console.log("err creating contract", e);} else {if (!contract.address) {console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");} else {console.log("Contract mined! Address: " + contract.address);console.log(contract);}}
});
unlockAccount一直Error: account unlock with HTTP access is forbidden,试了http://coder55.com/article/100458这里说的方法也没用
猜测是需要重新启动./startnode1.sh运行了但是没成功(线程冲突??)
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> eth.accounts
["0x03af8e050a5f40aec7a16eefefd9082aa89c038a", "0xe754b58a7147619d70b49dded8bddfb2b66366b4"]
> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> ^C
> exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
15511 pts/1 00:00:00 geth
15534 pts/1 00:00:00 ps
17165 pts/1 00:00:44 java
17941 pts/1 00:00:47 java
30059 pts/1 00:00:34 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> eth.accounts
["0x03af8e050a5f40aec7a16eefefd9082aa89c038a", "0xe754b58a7147619d70b49dded8bddfb2b66366b4"]
> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:00:46 java
17941 pts/1 00:00:49 java
18711 pts/1 00:00:00 geth
18848 pts/1 00:00:00 ps
30059 pts/1 00:00:40 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:00:51 java
17941 pts/1 00:00:55 java
26032 pts/1 00:00:00 geth
26123 pts/1 00:00:00 ps
30059 pts/1 00:00:53 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
bash: 未预期的符号 `(' 附近有语法错误
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc --allow-insecure-unlock
Incorrect Usage: flag provided but not defined: -allow-insecure-unlockattach [command options] [arguments...]The Geth console is an interactive shell for the JavaScript runtime environment
which exposes a node admin interface as well as the Ðapp JavaScript API.
See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console.
This command allows to open a console on a running geth node.ETHEREUM OPTIONS:--datadir value Data directory for the databases and keystore (default: "/home/yanhao/.ethereum")API AND CONSOLE OPTIONS:--jspath loadScript JavaScript root path for loadScript (default: ".")--exec value Execute JavaScript statement--preload value Comma separated list of JavaScript files to preload into the console--rpcclitoken value RPC Client access token--rpcclitls.cert value Server's TLS certificate PEM file on connection by client--rpcclitls.cacert value CA certificate PEM file for provided server's TLS certificate on connection by client--rpcclitls.ciphersuites value Customize supported cipher suites when using TLS connection. Value is a comma-separated cipher suite string--rpcclitls.insecureskipverify Disable verification of server's TLS certificate on connection by clientflag provided but not defined: -allow-insecure-unlock
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:00:55 java
17941 pts/1 00:00:59 java
30059 pts/1 00:01:04 geth
31660 pts/1 00:00:00 ps
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:00:55 java
17941 pts/1 00:00:59 java
30059 pts/1 00:01:05 geth
31993 pts/1 00:00:00 geth
32028 pts/1 00:00:00 ps
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> eth.accounts
["0x03af8e050a5f40aec7a16eefefd9082aa89c038a", "0xe754b58a7147619d70b49dded8bddfb2b66366b4"]
> personal.unlockAccount("0x03af8e050a5f40aec7a16eefefd9082aa89c038a");
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
>
> exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD5057 pts/1 00:00:00 ps
12185 pts/1 00:00:00 bash
17165 pts/1 00:01:00 java
17941 pts/1 00:01:04 java
30059 pts/1 00:01:15 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD5532 pts/1 00:00:00 ps
12185 pts/1 00:00:00 bash
17165 pts/1 00:01:00 java
17941 pts/1 00:01:04 java
30059 pts/1 00:01:16 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD5604 pts/1 00:00:00 geth5693 pts/1 00:00:00 ps
12185 pts/1 00:00:00 bash
17165 pts/1 00:01:00 java
17941 pts/1 00:01:04 java
30059 pts/1 00:01:17 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> personal.unlockAccount(eth.accounts[0])
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: account unlock with HTTP access is forbidden
> exit
原因找到了,实际上上面的教程所说的需要添加–allow-insecure-unlock是对的,只不过我在重启节点./startnode1.sh的时候,并没有重启成功,通过geth.ipc未更新可以发现。于是我先su root进入root,通过netstat -nap|grep 22000和22001分别kill对应的进程,重新启动才成功。接下来,unlock就成功了。全过程如下:备注unlock密码是yanhao12
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ netstat -nap|grep 22001
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
tcp6 0 0 :::22001 :::* LISTEN -
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ rootCommand 'root' not found, did you mean:command 'roo' from snap roo (2.0.3)command 'toot' from snap toot (0.27.0)command 'rootv' from deb xawtvcommand 'proot' from deb prootcommand 'rott' from deb rottSee 'snap info <snapname>' for additional versions.yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ su root
密码:
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# netstat -nap|grep 22001
tcp6 0 0 :::22001 :::* LISTEN 10661/docker-proxy
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# kill 10661
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# netstat -nap|grep 22001
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# netstat -nap|grep 22000
tcp6 0 0 :::22000 :::* LISTEN 30059/geth
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# exit
exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
12185 pts/1 00:00:00 bash
17165 pts/1 00:01:16 java
17941 pts/1 00:01:21 java
27987 pts/1 00:00:00 geth
28383 pts/1 00:00:00 ps
30059 pts/1 00:01:59 geth
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ su root
密码:
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# netstat -nap|grep 22000
tcp6 0 0 :::22000 :::* LISTEN 30059/geth
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# kill 30059
root@yanhao-ThinkPad-T480:/home/yanhao/quorum/fromscratch-again# exit
exit
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> eth.accounts
["0x03af8e050a5f40aec7a16eefefd9082aa89c038a", "0xe754b58a7147619d70b49dded8bddfb2b66366b4"]
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
true
>
继续,新的错误!
> loadScript("private-contract.js")
err creating contract Error: Non-200 status code: &{Status:404 Not Found StatusCode:404 Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[Content-Length:[73] Content-Type:[text/plain] Date:[Tue, 08 Sep 2020 13:10:43 GMT] Server:[Jetty(9.4.25.v20191220)] Tesserasupportedapiversions:[0.10.6]] Body:0xc00a4eafc0 ContentLength:73 TransferEncoding:[] Close:false Uncompressed:false Trailer:map[] Request:0xc000273500 TLS:<nil>}
true
>
根据官网的提示:如果private-contract.js中的数组中没有有效的公共密钥,则在加载脚本时会看到以下错误。
节点2的公钥改一下就行,去new-node-2t目录下的.pub文件查看。
yanhao@yanhao-ThinkPad-T480:~$ cd quorum
yanhao@yanhao-ThinkPad-T480:~/quorum$ ls
accounts COPYING event Makefile raft
appveyor.yml COPYING.LESSER extension metrics README.md
AUTHORS core fromscratch miner rlp
build crypto fromscratch-again mkdocs.yml rpc
BUILDING.md dashboard fromscratch-new mobile SECURITY.md
circle.yml Dockerfile graphql node signer
cmd Dockerfile.alltools interfaces.go NOTES.md tests
common docs internal p2p trie
consensus eth les params vendor
console ethclient light permission whisper
containers ethdb log plugin
contracts ethstats logo.png private
yanhao@yanhao-ThinkPad-T480:~/quorum$ cd fromscratch-again/
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD
24780 pts/0 00:00:00 bash
30242 pts/0 00:00:00 ps
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-1t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ java -jar ../tessera.jar -configfile config.json >> tessera.log 2>&1 &
[1] 32472
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-1t$ cd ../new-node-2t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ java -jar ../tessera.jar -configfile config.json >> tessera.log 2>&1 &
[2] 522
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ psPID TTY TIME CMD522 pts/0 00:00:02 java542 pts/0 00:00:00 ps
24780 pts/0 00:00:00 bash
32472 pts/0 00:00:04 java
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ cd ..
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode1.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ./startnode2.sh
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ psPID TTY TIME CMD522 pts/0 00:00:26 java1699 pts/0 00:00:00 geth1780 pts/0 00:00:00 geth1864 pts/0 00:00:00 ps
24780 pts/0 00:00:00 bash
32472 pts/0 00:00:29 java
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json new-node-2 nodekey nohup.out startnode2.sh
new-node-1 new-node-2t nodekey2 private-contract.js static-nodes.json
new-node-1t node2.log node.log startnode1.sh tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ cd new-node-2t
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ ls
config.json db1.trace.db new-node-2.pub tm.ipc
db1.mv.db new-node-2.key tessera.log
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ new-node-2.pub
new-node-2.pub:未找到命令
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ vim new-node-2.pub
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ vim private-contract.js
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ ls
config.json db1.trace.db new-node-2.pub tm.ipc
db1.mv.db new-node-2.key tessera.log
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again/new-node-2t$ cd ..
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ ls
genesis.json new-node-2 nodekey nohup.out startnode2.sh
new-node-1 new-node-2t nodekey2 private-contract.js static-nodes.json
new-node-1t node2.log node.log startnode1.sh tessera.jar
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ vim private-contract.js yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
coinbase: 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-1modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> eth.accounts
["0x03af8e050a5f40aec7a16eefefd9082aa89c038a", "0xe754b58a7147619d70b49dded8bddfb2b66366b4"]
> personal.unlock(eth.accounts[0])
TypeError: 'unlock' is not a functionat <anonymous>:1:1> personal.unlockAccount(eth.accounts[0])
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: could not decrypt key with given password
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: could not decrypt key with given password
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
Error: could not decrypt key with given password
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x03af8e050a5f40aec7a16eefefd9082aa89c038a
Password:
true
> loadScript("private-contract.js")
Contract transaction send: TransactionHash: 0x5e070785d0530cd5d94e108afaedc65c9d2e9df4431b9009c9994c020d27ebc1 waiting to be mined...
true
> loadScript("private-contract.js")
Contract transaction send: TransactionHash: 0x630fac3873348923c41d549f6a4be193791029d0cdc7473c1a1e8b96fa900831 waiting to be mined...
true
>
正确的需要有Contract mined!提示并返回合约地址,此处为: 0x701118c5f2a39db8e05d32c5bfb269cb0bb787b9。
> loadScript('private-contract.js')
Contract transaction send: TransactionHash: 0x289cfde30f057b6d6cb24570d54a225227464d51cb5eb1f6d01c6daa36d63e6c waiting to be mined...
true
> Contract mined! Address: 0x701118c5f2a39db8e05d32c5bfb269cb0bb787b9
[object Object]
重开终端-连接节点2:
yanhao@yanhao-ThinkPad-T480:~/quorum/fromscratch-again$ geth attach new-node-2/geth.ipc
Welcome to the Geth JavaScript console!instance: Geth/v1.9.7-stable-de45c9bb(quorum-v2.7.0)/linux-amd64/go1.12.6
at block: 2 (Fri, 18 Sep 2020 14:44:42 CST)datadir: /home/yanhao/quorum/fromscratch-again/new-node-2modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 quorumExtension:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0> var abi=[{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"initVal","type":"uint256"}],"payable":false,"type":"constructor"}];
undefined
> var address="0x701118c5f2a39db8e05d32c5bfb269cb0bb787b9";
undefined
> var contract=eth.contract(abi).at(address);
undefined
> contract.get()
42
>
上述脚本(private-contract.js)在节点1上部署了一个简单的状态值为42的存储合约,交易是节点1和节点2之间私有的,这意味着其他节点将看不到这个状态值。
所以,进入节点2的geth终端,使用ABI和合约地址创建合约实例,然后尝试读取状态值,可以得到42(如上)。
Quorum企业以太坊搭建区块链记录系列相关推荐
- Quorum企业以太坊环境搭建教程
Quorum企业以太坊环境搭建教程 Quorum是一个许可制的以太坊联盟区块链实现,包含了金融巨头JP摩根开发的一个GETH分支版本, 可以在节点之间实现私有和快速的交易.Quorum为保证隐私对节点 ...
- 比特币vs分布式账本vs以太坊vs区块链
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 我们经常被告知,区块链 - 比特币背后的技术 - 不仅将重新布线银行业,还包括社会保障支付,医疗保健甚至数字投票. 到目 ...
- 以太坊开启区块链2.0时代
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 今天我们唠唠以太坊,这个开启区块链2.0时代的伟大项目. 前面我们说比特币实际上是一个大账本,从比特币白皮书里走出来的区 ...
- 如何开始学习以太坊及区块链
一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取了技术架构和体系,称之为区块链技术.从比特币提取的区块链技术称之为区块链1. ...
- 以太坊和区块链实战技术分析详解
想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!!以太坊和区块链 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技 ...
- 以太坊geth区块链私链建立
想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!! 以太坊geth区块链私链建立 geth的github https://github.com/ethereum/g.. ...
- 使用web3和infura开发以太坊ethereum区块链
web3 Github: https://github.com/ethereum/web3.js/ web3.js是以太坊提供的一个Javascript库,它封装了以太坊的RPC通信API,提供了一系 ...
- 干货|破解遗传算法——CryptoPups旺财,基于以太坊的区块链游戏(分享实录)
CryptoPups旺财是一个类似谜恋猫的游戏,即将推出新的手机中文版.本文将通过CryptoPups旺财来分享基于以太坊的区块链游戏. 1 游戏结构和技术概述 其实我个人认为谜恋猫跟传统的游戏比起来 ...
- 干货|破解遗传算法——CryptoPups旺财,基于以太坊的区块链游戏(分享实录)...
CryptoPups旺财是一个类似谜恋猫的游戏,即将推出新的手机中文版.本文将通过CryptoPups旺财来分享基于以太坊的区块链游戏. 1 游戏结构和技术概述 其实我个人认为谜恋猫跟传统的游戏比起来 ...
- 以太坊搭建联盟链_区块链知识普及:什么是以太坊
以太坊(Ethereum)是下一代密码学账本,可以支持众多的高级功能,包括用户发行货币,智能协议,去中心化的交易和设立去中心化自治组织(DAOs)或去中心化自治公司(DACs).以太坊并不是把每一单个 ...
最新文章
- Play 1.x框架学习之五:错误信息显示 (error message display In play framework)
- 吴裕雄 oracle PL/SQL编程
- 计算机控制系统的稳态误差,计算机控制系统的稳态误差
- aMDcpu不支持mysql_Oracle 11.2.0.1在AMD CPU 64位硬件,32位操作系统下的BUG 8670579
- OC基础--成员变量的封装
- Quay (3) - 访问权限管理
- springcloud gateway_Spring Cloud构建微服务架构(五)服务网关
- [图]谷歌街景地图如何生成:步行记录者生活记录
- Unknown host ‘dl.google.com‘ You may need to adjust the proxy settings in Gradle的解决方案
- 数据科学家处理小数据的7个技巧。
- skyeye模拟器的安装
- JS中操作<select>标签选的值
- primary计算机英语,模拟试题1_计算机专业英语_doc_大学课件预览_高等教育资讯网...
- python实现图片文字提取,准确率高达99%,强无敌!!!
- uni-icons中添加自定义图标
- 今天收到了华为的录取通知
- python画多层网络_在pymn中修改多层网络图
- springboot-定时任务
- 人生是一场修行,修行的结果是个球
- 学Python基础面向对象看这一篇文章就够了【全网首推】