以太坊·单机多实例演示


声明:本文转载自https://my.oschina.net/neochen/blog/1622607,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

本文节选自电子书《Netkiller Blockchain 手札》

 

Netkiller Blockchain 手札

本文作者最近在找工作,有意向致电 13113668890

Mr. Neo Chan, 陈景峯(BG7NYT)


中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890

<netkiller@msn.com>

文档始创于2018-02-10

版权 © 2018 Netkiller(Neo Chan). All rights reserved.

 

版权声明

转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

http://www.netkiller.cn
http://netkiller.github.io
http://netkiller.sourceforge.net
微信订阅号 netkiller-ebook (微信扫描二维码)
QQ:13721218 请注明“读者”
QQ群:128659835 请注明“读者”

 

$Data$

内容摘要

这一部关于区块链开发及运维的电子书。

为什么会写区块链电子书?因为2018年是区块链年。

这本电子书是否会出版(纸质图书)? 不会,因为互联网技术更迭太快,纸质书籍的内容无法实时更新,一本书动辄百元,很快就成为垃圾,你会发现目前市面的上区块链书籍至少是一年前写的,内容已经过时,很多例子无法正确运行。所以我不会出版,电子书的内容会追逐技术发展,及时跟进软件版本的升级,做到内容最新,至少是主流。

这本电子书与其他区块链书籍有什么不同?市面上大部分区块链书籍都是用2/3去讲区块链原理,只要不到 1/3 的干货,干货不够理论来凑,通篇将理论或是大谈特谈区块链行业,这些内容更多是头脑风暴,展望区块链,均无法落地实施。本书与那些书籍完全不同,不讲理论和原理,面向应用落地,注重例子,均是干货。

电子书更新频率?每天都会有新内容加入,更新频率最迟不会超过一周,更新内容请关注 https://github.com/netkiller/netkiller.github.io/commits/master

本文采用碎片化写作,原文会不定期更新,请尽量阅读原文。

http://www.netkiller.cn/blockchain/index.html

2.3. 单机多实例演示

在没有条件安装虚拟机也没有多台服务器的情况下我们可以使用一台服务器运行多个实例的方法也可以实现多个节点运行环境。

cd ~ mkdir -p ethereum cd ethereum mkdir data{1,2}

创建文件 genesis.json

{   "nonce": "0x0000000000000042",   "difficulty": "0x020000",   "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",   "coinbase": "0x0000000000000000000000000000000000000000",   "timestamp": "0x00",   "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",   "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",   "gasLimit": "0x4c4b40",   "config": {       "chainId": 15,       "homesteadBlock": 0,       "eip155Block": 0,       "eip158Block": 0   },   "alloc": { } }

2.3.1. 实例一

geth --datadir ~/ethereum/data1 init genesis.json geth --datadir="~/ethereum/data1" --networkid 123456 --port 30301 --rpc --rpcaddr="0.0.0.0" --rpccorsdomain "*" --rpcport 8541

启动后终端输出

neo@netkiller ~/ethereum % geth --datadir ~/ethereum/data1 init genesis.json WARN [02-02|22:09:56] No etherbase set and no accounts found as default  INFO [02-02|22:09:56] Allocated cache and file handles         database=/home/neo/ethereum/data1/geth/chaindata cache=16 handles=16 INFO [02-02|22:09:56] Writing custom genesis block  INFO [02-02|22:09:56] Successfully wrote genesis state         database=chaindata                               hash=611596…424d04 INFO [02-02|22:09:56] Allocated cache and file handles         database=/home/neo/ethereum/data1/geth/lightchaindata cache=16 handles=16 INFO [02-02|22:09:57] Writing custom genesis block  INFO [02-02|22:09:57] Successfully wrote genesis state         database=lightchaindata                               hash=611596…424d04  neo@netkiller ~ % geth --datadir="~/ethereum/data1" --networkid 123456 --port 30301 --rpc --rpcaddr="0.0.0.0" --rpccorsdomain "*" -rpcport 8541              WARN [02-02|22:36:02] No etherbase set and no accounts found as default  INFO [02-02|22:36:02] Starting peer-to-peer node               instance=Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.1 INFO [02-02|22:36:02] Allocated cache and file handles         database=/home/neo/ethereum/data1/geth/chaindata cache=128 handles=1024 INFO [02-02|22:36:02] Initialised chain configuration          config="{ChainID: 15 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}" INFO [02-02|22:36:02] Disk storage enabled for ethash caches   dir=/home/neo/ethereum/data1/geth/ethash count=3 INFO [02-02|22:36:02] Disk storage enabled for ethash DAGs     dir=/home/neo/.ethash                    count=2 INFO [02-02|22:36:02] Initialising Ethereum protocol           versions="[63 62]" network=123456 INFO [02-02|22:36:02] Loaded most recent local header          number=0 hash=611596…424d04 td=131072 INFO [02-02|22:36:02] Loaded most recent local full block      number=0 hash=611596…424d04 td=131072 INFO [02-02|22:36:02] Loaded most recent local fast block      number=0 hash=611596…424d04 td=131072 INFO [02-02|22:36:02] Loaded local transaction journal         transactions=0 dropped=0 INFO [02-02|22:36:02] Regenerated local transaction journal    transactions=0 accounts=0 INFO [02-02|22:36:02] Starting P2P networking  INFO [02-02|22:36:05] UDP listener up                          self=enode://53433417f11d1d9a17f155cbaad2c4ec375af7b141e2989f049b572fc3f856d78f254e58fa82ed6eab48a16b7d625527214522ec0fd3e3af030b5b8dfdadc062@14.103.209.119:30301 INFO [02-02|22:36:05] HTTP endpoint opened: http://0.0.0.0:8541  INFO [02-02|22:36:05] IPC endpoint opened: /home/neo/ethereum/data1/geth.ipc  INFO [02-02|22:36:05] RLPx listener up                         self=enode://53433417f11d1d9a17f155cbaad2c4ec375af7b141e2989f049b572fc3f856d78f254e58fa82ed6eab48a16b7d625527214522ec0fd3e3af030b5b8dfdadc062@14.103.209.119:30301 INFO [02-02|22:36:05] Mapped network port                      proto=udp extport=30301 intport=30301 interface="UPNP IGDv1-IP1" INFO [02-02|22:36:07] Mapped network port                      proto=tcp extport=30301 intport=30301 interface="UPNP IGDv1-IP1"

2.3.2. 实例二

geth --datadir ~/ethereum/data2 init genesis.json geth --datadir="~/ethereum/data2" --networkid 123456 --port 30302 --rpc --rpcaddr="0.0.0.0" --rpccorsdomain "*" --rpcport 8542

启动后控制台输出与实例一类似

2.3.3. 添加节点

开启一个新终端窗口,运行下面命令查看节点一的 enode 字符串

geth --exec 'admin.nodeInfo.enode' attach ethereum/data1/geth.ipc "enode://53433417f11d1d9a17f155cbaad2c4ec375af7b141e2989f049b572fc3f856d78f254e58fa82ed6eab48a16b7d625527214522ec0fd3e3af030b5b8dfdadc062@[::]:30301?discport=0"

进入节点二,并连接到节点一。

neo@netkiller ~ % geth attach ethereum/data2/geth.ipc Welcome to the Geth JavaScript console!  instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.1  modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0  > admin.addPeer("enode://53433417f11d1d9a17f155cbaad2c4ec375af7b141e2989f049b572fc3f856d78f254e58fa82ed6eab48a16b7d625527214522ec0fd3e3af030b5b8dfdadc062@[::]:30302") true > admin.addPeer("enode://53433417f11d1d9a17f155cbaad2c4ec375af7b141e2989f049b572fc3f856d78f254e58fa82ed6eab48a16b7d625527214522ec0fd3e3af030b5b8dfdadc062@[::]:30301") true

查看节点

> admin.peers [{     caps: ["eth/63"],     id: "53433417f11d1d9a17f155cbaad2c4ec375af7b141e2989f049b572fc3f856d78f254e58fa82ed6eab48a16b7d625527214522ec0fd3e3af030b5b8dfdadc062",     name: "Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.1",     network: {       localAddress: "[::1]:51250",       remoteAddress: "[::1]:30301"     },     protocols: {       eth: {         difficulty: 131072,         head: "0x611596e7979cd4e7ca1531260fa706093a5492ecbdf58f20a39545397e424d04",         version: 63       }     } }]

至此,节点已经添加完毕。

> exit

退出

2.3.4. 节点测试

这里我们实现两个节点间的以太币转账。

现在两个节点上都没有任何账号

neo@netkiller ~ % geth --exec 'personal.listAccounts' attach ethereum/data1/geth.ipc                                         [] neo@netkiller ~ % geth --exec 'personal.listAccounts' attach ethereum/data2/geth.ipc []

在两个节点上分别创建两个账号,一个是矿工账号,另一个是普通账号。

neo@netkiller ~ % geth --exec 'personal.newAccount("abc123")' attach ethereum/data1/geth.ipc "0x5ad227e8d7e460713c78eebbe558473571edae72"  neo@netkiller ~ % geth --exec 'personal.newAccount("abc123")' attach ethereum/data1/geth.ipc "0x3e822e05ee975e02be3f15f32b0fddced8d5bdd0"  neo@netkiller ~ % geth --exec 'personal.listAccounts' attach ethereum/data1/geth.ipc  ["0x5ad227e8d7e460713c78eebbe558473571edae72", "0x3e822e05ee975e02be3f15f32b0fddced8d5bdd0"]    neo@netkiller ~ % geth --exec 'personal.newAccount("abc123")' attach ethereum/data2/geth.ipc "0xa6df3e3c141e27726f4aeb21a5dab2e5c76c9565"  neo@netkiller ~ % geth --exec 'personal.newAccount("abc123")' attach ethereum/data2/geth.ipc "0xa66c7b8b1c26856d284a0b962385babe02caa51d"  neo@netkiller ~ % geth --exec 'personal.listAccounts' attach ethereum/data2/geth.ipc  ["0xa6df3e3c141e27726f4aeb21a5dab2e5c76c9565", "0xa66c7b8b1c26856d284a0b962385babe02caa51d"]

启动挖矿

geth --exec 'miner.start(1)' attach ethereum/data1/geth.ipc  geth --exec 'miner.start(1)' attach ethereum/data2/geth.ipc

如果正常运行,两个节点上的矿工账号都会有一定的以太币。而普通账号额度应该为零。

neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[0])' attach ethereum/data1/geth.ipc 299438256000000000000  neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[1])' attach ethereum/data1/geth.ipc 0  neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[1])' attach ethereum/data1/geth.ipc 298000056000000000000  neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[1])' attach ethereum/data2/geth.ipc 0

我们尝试从节点一矿工账号向节点二上的普通用户转账。

neo@netkiller ~ % geth attach ethereum/data1/geth.ipc                                Welcome to the Geth JavaScript console!  instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.1 coinbase: 0x5ad227e8d7e460713c78eebbe558473571edae72 at block: 144 (Fri, 02 Feb 2018 23:24:35 HST)  datadir: /home/neo/ethereum/data1  modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0  > personal.listAccounts ["0x5ad227e8d7e460713c78eebbe558473571edae72"]  > personal.unlockAccount(eth.accounts[0], "abc123") true  > eth.sendTransaction({from: "0x5ad227e8d7e460713c78eebbe558473571edae72", to: "0xa66c7b8b1c26856d284a0b962385babe02caa51d", value: web3.toWei(1, "ether")}) "0x87c059d0769c8a74499ddd08c04a10f23b7681651615a28098d73ec63a943684"  > eth.pendingTransactions [{     blockHash: null,     blockNumber: null,     from: "0x5ad227e8d7e460713c78eebbe558473571edae72",     gas: 90000,     gasPrice: 18000000000,     hash: "0x87c059d0769c8a74499ddd08c04a10f23b7681651615a28098d73ec63a943684",     input: "0x",     nonce: 2,     r: "0xce004f964f268a00e90cadd4e8a685131aa34f37144f7e2e47dc7fe4ec784e55",     s: "0x412209c18513a28422e62c4bdb85a223f190e133cf71990a87c570a3a53ae093",     to: "0xa66c7b8b1c26856d284a0b962385babe02caa51d",     transactionIndex: 0,     v: "0x41",     value: 1000000000000000000 }]

稍后一会,当使用 eth.pendingTransactions 查看挂起交易为空的时候,表示已经处理完毕。这时退出控制台。

> eth.pendingTransactions [] > exit

现在查看节点二上的第二个普通账号余额

neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[1])' attach ethereum/data2/geth.ipc 1000000000000000000

转账成功

现在我们从节点二上的普通用户向节点一上的普通用户转账。

neo@netkiller ~ % geth attach ethereum/data2/geth.ipc                                         Welcome to the Geth JavaScript console!  instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.1 coinbase: 0xa6df3e3c141e27726f4aeb21a5dab2e5c76c9565 at block: 319 (Fri, 02 Feb 2018 23:50:07 HST)  datadir: /home/neo/ethereum/data2  modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0  > personal.unlockAccount(eth.accounts[1], "abc123") true  > eth.sendTransaction({from: "0xa66c7b8b1c26856d284a0b962385babe02caa51d", to: "0x3e822e05ee975e02be3f15f32b0fddced8d5bdd0", value: web3.toWei(0.1, "ether")}) "0x951bd161dfd000ff825379cb0644c4acd4afd4d3e1ac4f4c1c6009b3c2a1d366"  > eth.pendingTransactions [] > exit

查看两个普通账号的余额

neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[1])' attach ethereum/data1/geth.ipc 100000000000000000 neo@netkiller ~ % geth --exec 'eth.getBalance(eth.accounts[1])' attach ethereum/data2/geth.ipc 899622000000000000

 

 

本文发表于2018年02月22日 18:31
(c)注:本文转载自https://my.oschina.net/neochen/blog/1622607,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1822 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1