win10下构建以太坊私链

一:安装geth客户端

1、环境是win10,Windows要求必须是64位系统,下载geth客户端和钱包客户端

Geth : https://geth.ethereum.org/downloads/ 

Mist:  https://github.com/ethereum/mist/releases 

2、安装geth.exe

3、进入到geth安装目录下

cd E:\软件安装目录\Geth

4、配置自己的创世块是为了区分公有链,在上面3的目录下新建创始区块文件genesis.json,同一个网络节点群中创始区块必须相同,否则无法连通:

{

    "config": {

    "chainId": 1111,

    "homesteadBlock": 0,

    "eip155Block": 0,

    "eip158Block": 0

    },

    "alloc" : {},

    "coinbase" :"0x0000000000000000000000000000000000000000",

    "difficulty" : "0x99999",

    "extraData" : "",

    "gasLimit" : "0xffffffff",

    "nonce" :"0x0000000000000042",

    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",

    "parentHash" :"0x0000000000000000000000000000000000000000000000000000000000000000",

    "timestamp" : "0x00"

}

各参数指标如下:

mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。这里是初始区块

nonce:nonce就是一个64位随机数,用于挖矿

difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度0x99999十六进制 “0x99999” 对应的十进制 629145还是挺快的,半分钟大概30个,就是一秒一个

alloc:用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。

coinbase:矿工的账号,任定义

timestamp:设置创世块的时间戳

parentHash:上一个区块的hash值,因为是创世块,所以这个值是0

extraData:附加信息,随便填,可以填你的个性信息

gasLimit:该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

chainId:以太坊区块链网络Id,ethereum主链是1,私有链只用不要与主链冲突即可。

5、在3中目录下运行命令,从而创建目录并存储创世区块数据。

geth --datadir data0 init genesis.json

此时在文件夹data0下会生成两个文件夹geth和keystore,一个存储块信息,一个存储用户信息

6、启动运行私链,命令行输入:

geth --identity "node0" --datadir "data0" --rpc--rpccorsdomain "*" --nodiscover --rpcapi "db,eth,net,web3,personal" --rpcaddr "127.0.0.1" --rpcport "8486" --port "30304" --networkid "1111" --ipcdisable console

使用命令 geth -h 可以查看geth 相关的帮助文档。这里我说几个常用的属性。

identity:区块链的标示,随便填写,用于标示目前网络的名字

init:指定创世块文件的位置,并创建初始块

datadir:设置当前区块链网络数据存放的位置

port:网络监听端口

rpc:启动rpc通信,可以进行智能合约的部署和调试

rpcapi:设置允许连接的rpc的客户端,一般为db,eth,net,web3

networkid:网络标识符 随便指定一个id(确保多节点是统一网络,保持一致)

console:启动命令行模式,可以在Geth中执行命令

rpcaddr:http-rpc服务器接口地址:默认“127.0.0.1”

rpcport:http-rpc 端口(多节点时,不要重复)

port:节点端口号(多节点时,不要重复)

7、启动Ethereum Wallet钱包,显示“PRIVATE-NET”,说明私链启动成功


应该来源于某网站

附:为了不用每次启动都敲如此长的命令,可以将此命令写到一个脚本中运行,具体创建的脚本文件如下:


其中Genesis.json文件是上述的创始区块文件

init-private-net.bat文件内容是初始化命令,具体如下:

geth --identity "node0" --rpc --rpccorsdomain "*" --datadir "D:\File Storage Document\Cloud Audit\MyChain\data0" --rpcapi "db,eth,net,web3,admin,personal,rpc,miner" --networkid "100" init D:\File Storage Document\Cloud Audit\MyChain\dev\Genesis.json

start-private-net.bat文件内容是启动私链命令,具体如下

geth --datadir "D:\File Storage Document\Cloud Audit\MyChain\data0" --identity "node0" --rpc --rpcapi "db,eth,net,web3,admin,personal,rpc,miner" --rpccorsdomain "*" --networkid "100" console

注意替换两个文件中的datadir路径、Genesis路径以及networkid与Genesis.json文件中的保持一致

二、Geth命令

详细的geth命令可参考官方文档:

https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

或者

https://www.choupangxia.com/topic/detail/9

1、 #给新节点创建一个账户,否则无法启动挖矿

>personal.newAccount("123456")

2、 #获取账户数组

  >eth.accounts  

3、 #解锁账户,发起交易前必须先解锁账户!!!!!!!

      >personal.unlockAccount(eth.accounts[0],"123456",1000000000)

4、 #节点主账户

 >eth.coinbase

5、#查看账户余额

      > eth.getBalance(eth.accounts[0])

      >web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')

6、#启动,结束挖矿,写区块

      > miner.start(3),  miner.stop() 

       >miner.start();admin.sleepBlocks(1);miner.stop();

其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

7、#查看节点信息

>admin.nodeInfo

8、#查看节点是否连接

>admin.peers

>net.peerCount

9、#启查阅两个节点的块个数,是一样的,完成同步

>eth.blockNumber

eth.blockNumber查询区块数量,eth.getBlock(47)查询对应区块的内容。

10、通过查看txpool来查看交易

       > txpool.status

{

     pending:1

      queued: 0

}

其中有一条pending的交易,pending表示已提交但还未被处理的交易。

11、查看交易内容

> eth.getTransaction(“TXID”)

三:配置多节点服务

给私有的以太坊网络添加一个节点

搭建本地私有节点需要注意:

1、每个节点需要有不同的数据目录(--datadir)

2、每个节点都有独立的端口(--port、--rpcprot 、--ipc)

3、在集群情况下,实例之间必须知道彼此(--networkid)

4、节点的创世块信息必须一样

?参考性意见,不一定正确?注:搭建节点服务器最好有公网ip,读者这里在局域网中没有搭建成功

1.  再初始化一个节点

geth --datadir data1init genesis.json

////or

geth --identity "node0" --rpc --rpccorsdomain "*" --datadir "E:\MyChain\data0" --rpcapi "db,eth,net,web3,admin,personal,rpc,miner" --networkid "100" init E:\MyChain\dev\Genesis.json

geth --identity "node1" --rpc --rpccorsdomain "*" --datadir "E:\MyChain\data1" --rpcapi "db,eth,net,web3,admin,personal,rpc,miner" --networkid "100" init E:\MyChain\dev\Genesis.json

“data1”作为新节点的存储目录,同样使用 genesis.json作为初始化文件

2.  启动新节点

geth --identity "node0" --datadir "data0" --rpc--rpccorsdomain "*" --nodiscover --rpcapi "db,eth,net,web3,personal" --rpcaddr "127.0.0.1" --rpcport "8486" --port "30304" --networkid "1111"--ipcdisableconsole

geth --identity "node1" --datadir "data1" --rpc--rpccorsdomain "*" --nodiscover --rpcapi "db,eth,net,web3,personal" --rpcaddr "127.0.0.1" --rpcport "8487" --port "30305" --networkid "1111"--ipcdisableconsole

geth --identity "node2" --datadir "data2" --rpc--rpccorsdomain "*" --nodiscover --rpcapi "db,eth,net,web3,personal" --rpcaddr "127.0.0.1" --rpcport "8488" --port "30306" --networkid "1111" --ipcdisable console

geth --datadir "E:\MyChain\data0" --identity "node0" --rpc --rpcapi "db,eth,net,web3,admin,personal,rpc,miner" --rpccorsdomain "*" --networkid "100" --rpcaddr "127.0.0.1" --rpcport "8486" --port "30304" --ipcdisable console

geth --datadir "E:\MyChain\data1" --identity "node1" --rpc --rpcapi "db,eth,net,web3,admin,personal,rpc,miner" --rpccorsdomain "*" --networkid "100" --rpcaddr "127.0.0.1" --rpcport "8487" --port "30305" --ipcdisable console

会遇到无法同时启动几个节点的问题,所以最好用nodiscover,ipcdisable,这两个参数很关键,windows没有ipcdisable参数,第二个节点启动会报错的。nodiscover让节点2不会被节点1自动扫描到。

3. 给新节点创建一个账户,否则无法启动挖矿

  >personal.newAccount("123456")

4.查看新节点enode信息,使用你新节点ip(即本机ip)替换[::]

>admin.nodeInfo.enode

"enode://55040d99d746e08d3789daf65d346675317e8153c2195f51ce3e31ed907c47d99225f75e84cbc00f447032619fc31eb41d5322a650da5fe7a7f6ccb3b6c8b7cf@[::]:30305"

5.重要:主节点添加新节点,使两节点连上同一个私有链上(在主节点cmd窗口执行)

>admin.addPeer("enode://55040d99d746e08d3789daf65d346675317e8153c2195f51ce3e31ed907c47d99225f75e84cbc00f447032619fc31eb41d5322a650da5fe7a7f6ccb3b6c8b7cf@127.0.0.1:30305")

admin.addPeer("enode://345b70162c50ca4273c7d86458c88c158cafe79c1437465189b1a666ec60bcf5295468bba240ae7f29588cd8d50476885d273e8ccd368eb6817ba5bbaf91b2c1@127.0.0.1:30306")

True

这里"enode://......." 填写你节点 admin.nodeInfo.enode 的信息

addPeer() 的参数就是节点二的 enode 信息,注意要把 enode 中的 [::] 替换成节点二的 IP 地址。连接成功后,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易

6.如何确保两节点已连接

通过admin.peers可以查看连接到的其他节点信息;

通过net.peerCount可以查看已连接到的节点数量;

>eth.blockNumber 查阅两个节点的块个数,是一样的,完成同步。

另外在其中一个节点启动挖矿命令,另一个节点会自动同步区块

7. 打开第二个节点钱包

  使用的mist钱包不能导入第二个节点钱包数据

    有两种方式打开多个节点钱包方式

(1)只读的http 方式打开钱包。不能转账,不能部署合约

        mist.exe --rpc http://127.0.0.1:8545

 (2)以rpc方式打开访问ipc接口方式打开mist钱包

        mist.exe --rpc \\\\.\\pipe\\data1\\geth\\geth.ipc  

##这是节点二指定的ipcpath路径, 可以看下我启动节点二的配置--ipcpath

至此,我们可以将第二个节点的钱包打开,进行节点可视化转账交易。

附:除了通过命令添加,还可以通过静态节点添加

在节点目录中创建static-nodes.json 文件

[

  要连接的节点(enode url)多个用,分隔

]

四:节点间转账(节点一转账给节点二)

1、在节点二新建账户:

>personal.newAccount("123456")

"0x9b78c5766ddbb55c4414ff5f441b4cea0c7a72a4"

2、查询新账户余额

>eth.getBalance(eth.accounts[0])

>web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')

0

3、在节点一的accounts[0]向外给节点二的账户转3个。

节点转账之前的余额

> eth.getBalance(eth.accounts[0])

500000000000000000000

定义3个ether

> amount = web3.toWei(3,'ether')

"3000000000000000000"

4、解锁节点一账户

> personal.unlockAccount(eth.accounts[0])

Unlock account 0x781ea3fbf05476db5d259c833347705d6ca770f2

Passphrase:

true

5、转账给节点二

>eth.sendTransaction({from:eth.accounts[0],to:"0x696fe0847b4340883d3ebae534fe0afbe4d5c21c",

value:amount})

INFO [07-31|12:48:20.509] Submitted transaction                    fullhash=0x298d16ec44cdfe0df81a73fd14c1d649789e3d6ce6806bbae50bc021654b5180

recipient=0x9b78C5766DdbB55C4414ff5F441B4cEa0C7a72a4"0x298d16ec44cdfe0df81a73fd14c1d649789e3d6ce6806bbae50bc021654b5180"

6此时交易已经提交到区块链,返回了交易的hash,但还未被处理,这可以通过查看txpool来验证:

> txpool.status

{

  pending: 1,

  queued: 0

}

其中有一条pending的交易,pending表示已提交但还未被处理的交易。

7、要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:

启动一个cpu挖矿

> miner.start(1);admin.sleepBlocks(1);miner.stop();

全力挖矿

> miner.start();admin.sleepBlocks(1);miner.stop();

8、当miner.stop()返回true后,txpoolpending的交易数量应该为0了,说明交易已经被处理了:

> txpool.status

{

  pending: 0,

  queued: 0

}

9、节点一自动同步节点二的新区块数据

> INFO [07-31|12:48:43.918]

Imported new chain segment             

blocks=1  txs=1 mgas=0.021 elapsed=5.004ms  mgasps=4.197 number=87

hash=1026c6…285caa cache=21.65kB

INFO [07-31|12:48:44.843]

Imported new chain segment             

blocks=1  txs=0 mgas=0.000 elapsed=4.002ms  mgasps=0.000 number=88

hash=1b3798…934171 cache=22.04kB

INFO [07-31|12:48:45.009]

Imported new chain segment             

blocks=1  txs=0 mgas=0.000 elapsed=6.004ms  mgasps=0.000 number=89

hash=68059b…dff0ae cache=22.43kB

INFO [07-31|12:48:47.123]

Imported new chain segment             

blocks=1  txs=0 mgas=0.000 elapsed=5.004ms  mgasps=0.000 number=90

hash=a8cf3e…7a64ba cache=22.83kB

10、查询节点一的账户余额,已经减少,同时节点二的余额已经增加。(同时节点会增加一部分新的挖矿所得)

>eth.getBalance(eth.accounts[0])

注意:

每个节点可以管理多个账户。

账户之间余额也是相互独立的

五:节点内账户转账(同节点间转账类似)

> personal.unlockAccount(eth.accounts[0])

> amount = web3.toWei(5,'ether')

> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

> txpool.status

> miner.start();admin.sleepBlocks(1);miner.stop();

> txpool.status

>

web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')

六:ubuntu系统搭建

1、安装geth客户端

sudo apt-get update

sudo apt-get install

software-properties-common

sudo add-apt-repository -y

ppa:ethereum/ethereum

sudo add-apt-repository -y

ppa:ethereum/ethereum-dev

sudo apt-get update

sudo apt-get install ethereum

安装完成后,输入geth -h,如果有列出信息则说明安装成功,可查看列出信息,方便后续的操作

Linux命令:

查看软件安装位置

dpkg -L ethereum

控制面板--》搜索“服务”--》管理工具(查看本地服务)--》启动microsoft ftp

备注:

[if !supportLists]1、[endif]挖矿难度

十六进制 “0x99999” 对应的十进制 629145还是挺快的,半分钟大概30个,就是一秒一个

DDDDDDDD 3722304989 挖不到 放大了近四万倍 等了三分钟没挖到

176ffe890 6291450000 放大一万倍,五分钟没挖到

5ffffa 6291450 放大十倍 一分钟五个

2ffffd 3145725 五倍 一分钟五到十个之间个

bffff4 12582900 二十倍 六分钟挖了八个

3bfffc4 62914500 一百倍 六分钟两个

12bffed4 314572500 五百倍 15分钟没有一个

77fff88 125829000 两百倍 十分钟两个

四五分钟一个区块是不是差不多了呢? 挖矿速度是可以通过算法自动调整,让速度保持与我们设置的难度值保持相当,但是后面区块的难度值都是跟初始块设置的难度值相关,所以只是由初始块的难度值决定整个链的速度.

这个是黄皮书关于难度值设定的算法

[if !vml]

[endif]

续:可参考链接

[if !supportLists]1、[endif]https://blog.csdn.net/huangyx123456/article/details/79717643

[if !supportLists]2、[endif]https://blog.csdn.net/liudaoqiang_tj/article/details/81295043

[if !supportLists]3、[endif]https://blog.csdn.net/hantangduhey/article/details/81017602

[if !supportLists]4、[endif]以太坊开发必看--文档集锦

https://blog.csdn.net/weixin_42758350/article/details/81335440


遇到的问题及解决方法:

1、[endif]web3.phpError: The method personal_newAccount does not exist/is not available

其实很简单,我们只需要在geth启动时的rpc参数中设置rpcapi时包括 “personal” 即可

geth --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi eth,web3,admin,personal,net

备份:7个节点

admin.addPeer("enode://8e3792d7fe3f036e1f4c3dbd1473438ab3d3e62483531a242883d5cccddcde5f2d8d4293f3ea46c086ba81a0b9691a1c9469949bfe001091a617a1be6347d9bc@127.0.0.1:30305");

admin.addPeer("enode://5f48d8181752295e13bb0cec595dd16661f28bd2484cc1de333801a29ca0bc4d31c10c463ba05630835d84d3741a590c778d7ce6f202e03df58fee2ca3861031@127.0.0.1:30306")

admin.addPeer("enode://26f5dd3f415ff4b270bb9afa72903d5f6e74430b09171c505f2295dd81fca1cb47f15dd21d46d844012c19e39c4bab096a9d64d9ac8a50b045fd4c644bfb1dad@127.0.0.1:30307");

admin.addPeer("enode://917128b17968ad164b443eab5f30a19d639df8f2920378890545a7f02e344d3e7de21a17f4489bcc4c95223f6d0cac3c213cf186d697689d505ead11c1195279@127.0.0.1:30308");

admin.addPeer("enode://908386519316ed1620f6978d25882f0b5da02599f2d047de6451c02e37ee6f38a78c60272e148210f5d4858f3d2c36b156589581d4bbbdf2e77dea00790c7181@127.0.0.1:30309")

admin.addPeer("enode://45129f69ff960a8bfd2dfc34dffbb651f38f3c86efb8c9490d573094601de32c217e27c4e13222d8a252fdc95c69aace2e341fbd5b1b758e2e87a21911bbc3c0@127.0.0.1:30310");

admin.addPeer("enode://78322bbda2b7cca8d7023233cbdd4bbd5d5ccfc66ff5ed2154e2fa52c8431baa16c7ee2b70bab4dedf19a0d255f849adf02e4ee3c1dd68c82e8aaae48d199b19@127.0.0.1:30311");




写在结尾:

如果此文对你有所帮助,请留下喜欢哦~ღ( ´・ᴗ・` )

                                                                                  -----朵耳

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266