一:安装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后,txpool中pending的交易数量应该为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");
写在结尾:
如果此文对你有所帮助,请留下喜欢哦~ღ( ´・ᴗ・` )
-----朵耳