• 以太坊搭建私有链(非常详细!!!)


    我的系统:CentOS7 64位

    我喜欢宝塔的直观:

    1. /www/server/panel/pyenv/bin/python3.7 -m pip install --upgrade pip
    2. yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

    环境需要:Go 1.9以上版本
    geth工具

    1. WARN [11-04|09:34:47.411] System clock seems off by -10h15m43.047110838s, which can prevent network connectivity
    2. WARN [11-04|09:34:47.411] Please enable network time synchronisation in system settings.

    一.环境搭建

    1.安装Go

    下载源码 https://golang.org/dl/
    找到适合自己操作系统的版本,必须1.9版本以上。我安装的是1.9.5
    解压到/usr/local下

    1. wget https://go.dev/dl/go1.20.3.linux-amd64.tar.gz
    2. tar -zxvf go1.20.3.linux-amd64.tar.gz -C /usr/local/
    3. #tar -zxvf go1.9.5.linux-amd64.tar.gz -C /usr/local/

    创建软链接

    ln -s /usr/local/go/bin/go  /usr/bin/go
    

    测试是否成功

    1. go version
    2. #go version go1.9.5 linux/amd64

    增加配置文件

    vim /etc/profile

    【tips】
    此时是vim的命令模式 我们需要在最后加入下面的代码 所以 vim的命令模式–>输入模式 的方法是按i键
    即 按i键 把光标移动到最后 换行 输入以下内容

    1. export GOROOT=/usr/local/go
    2. export PATH=$PATH:$GOROOT/bin
    3. export GOPATH=/opt/go
    4. export PATH=$PATH:$GOPATH/BIN

    更新环境变量

    source /etc/profile
    

    2.安装geth工具

    下载geth源码

    1. cd /usr/local/
    2. git clone https://github.com/ethereum/go-ethereum.git

    编译源码

    1. cd /usr/local/go-ethereum
    2. make

    成功的话会出现如下:

    1. Done building.
    2. Run "/usr/local/go-ethereum-master/build/bin/geth" to launch geth.

    创建软链接 这样我们可以直接用geth命令,而不用输入路径

    ln -s /usr/local/go-ethereum/build/bin/geth /usr/bin/geth
    

    make过程中 如果出现以下错误:
    exec: “gcc”: executable file not found in $PATH

    则是没有安装gcc的原因,执行

    yum install gcc
    

    二.搭建私有链

    1.创建用户

    1. mkdir geth
    2. cd geth

    进入geth控制台

    1. geth --datadir db --nodiscover console
    2. geth --datadir db --http.corsdomain "*" --http.api="db,eth,net,web3,personal" --ws.api="db,eth,net,web3,personal" --nodiscover console
    3. #控制台有时会打印特别多的日志,所以为了第一时间看到我们命令的返回结果,我们需要将多余的日志信息打印到日志文件中,使用如下命令即可:
    4. geth --datadir db --networkid 168 console 2>output.log

    创建用户

    1. > personal.newAccount()
    2. Passphrase:
    3. Repeat passphrase:
    4. "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
    5. > personal.newAccount()
    6. Passphrase:
    7. Repeat passphrase:
    8. "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"

    查看用户余额

    1. > eth.getBalance(eth.accounts[0])
    2. 0
    3. > eth.getBalance(eth.accounts[1])
    4. 0

    给用户创建别名

    1. > yujuan=eth.accounts[0]
    2. "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
    3. > hcb=eth.accounts[1]
    4. "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"

    可以看到在db目录下,有个keystore目录,里面已经存了我们刚刚创建的两个账户。(yum install tree)

    1. [root@localhost mychain]# tree
    2. .
    3. ├── geth
    4. │ ├── chaindata
    5. │ │ ├── 000001.log
    6. │ │ ├── CURRENT
    7. │ │ ├── LOCK
    8. │ │ ├── LOG
    9. │ │ └── MANIFEST-000000
    10. │ ├── LOCK
    11. │ ├── nodekey
    12. │ ├── nodes
    13. │ │ ├── 000001.log
    14. │ │ ├── CURRENT
    15. │ │ ├── LOCK
    16. │ │ ├── LOG
    17. │ │ └── MANIFEST-000000
    18. │ └── transactions.rlp
    19. ├── geth.ipc
    20. └── keystore├── UTC--2018-11-04T16-02-52.181405978Z--12844bb3206f10a331557bffb7c8d34ee4ca8b65└── UTC--2018-11-04T16-03-15.055116889Z--a6faa81cad6a3b038d9a51db80cedbe65184c7e2

    2.传世区块配置文件

    1. cd mychain
    2. vim genesis.json

    在genesis.json中输入如下内容

    1. {
    2. "config":
    3. {
    4. "chainId":15,
    5. "homesteadBlock":0,"
    6. eip155Block":0,
    7. "eip158Block":0
    8. },
    9. "alloc":
    10. {
    11. "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65":
    12. {"balance": "999000000000000000000"}
    13. },
    14. "nonce":"0x0000000000000001",
    15. "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    16. "difficulty": "0x01",
    17. "coinbase":"0x0000000000000000000000000000000000000000",
    18. "timestamp": "0x00",
    19. "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    20. "extraData": "0x777573686f756865",
    21. "gasLimit":"0xffffffff"
    22. }
    23. {
    24. "config" : {
    25. "chainId" : 168,
    26. "homesteadBlock": 0,
    27. "eip150Block" : 0,
    28. "eip155Block" : 0,
    29. "eip158Block" : 0
    30. },
    31. "coinbase" : "0x0000000000000000000000000000000000000000",
    32. "difficulty" : "0x20000",
    33. "extraData" : "",
    34. "gasLimit" : "0xffffffff",
    35. "nonce" : "0x0000000000000042",
    36. "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    37. "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    38. "timestamp" : "0x00",
    39. "alloc" : { }
    40. }
    41. {
    42. "config": {
    43. "chainId": 666,
    44. "homesteadBlock": 0,
    45. "eip150Block": 0,
    46. "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    47. "eip155Block": 0,
    48. "eip158Block": 0,
    49. "byzantiumBlock": 0,
    50. "constantinopleBlock": 0,
    51. "petersburgBlock": 0,
    52. "istanbulBlock": 0,
    53. "ethash": {}
    54. },
    55. "nonce": "0x0",
    56. "timestamp": "0x5ddf8f3e",
    57. "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    58. "gasLimit": "0x47b760",
    59. "difficulty": "0x00002",
    60. "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    61. "coinbase": "0x0000000000000000000000000000000000000000",
    62. "alloc": { },
    63. "number": "0x0",
    64. "gasUsed": "0x0",
    65. "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
    66. }
    67. {
    68. "config": {
    69. "chainId": 6668,
    70. "homesteadBlock": 0,
    71. "eip150Block": 0,
    72. "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    73. "eip155Block": 0,
    74. "eip158Block": 0,
    75. "byzantiumBlock": 0,
    76. "constantinopleBlock": 0,
    77. "petersburgBlock": 0,
    78. "istanbulBlock": 0,
    79. "ethash": {}
    80. },
    81. "nonce": "0x0",
    82. "timestamp": "0x5ddf8f3e",
    83. "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    84. "gasLimit": "0x47b760",
    85. "difficulty": "20000",
    86. "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    87. "coinbase": "0x0000000000000000000000000000000000000000",
    88. "alloc": {
    89. },
    90. "number": "0x0",
    91. "gasUsed": "0x0",
    92. "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
    93. }

    注意这里的alloc后的地址要用之前创建的地址

    3.初始化

    准备好创世区块配置文件后,需要初始化区块链,将上面的传世区块信息写入到区块链中。(第一次安装完Geth需要初始化,或是需要修改创世块重新设置时需要初始化,之后再不需要初始化)

    始初始化区块

    geth --datadir "./mychain/" init ./mychain/genesis.json

    –datadir 指定数据存放目录
    可能出现如下错误,原因是前面启动私有链时已经创建了默认的创世区块

    Fatal: Failed to write genesis block: database already contains an incompatible genesis block
    

    如下删除数据

    geth removedb
    

    成功的话可以看到如下结果

    1. [root@localhost blockchain]# geth --datadir "./mychain/" init ./mychain/genesis.json
    2. WARN [11-04|11:59:11.370] Sanitizing cache to Go's GC limits provided=1024 updated=324
    3. INFO [11-04|11:59:11.380] Maximum peer count ETH=25 LES=0 total=25
    4. INFO [11-04|11:59:11.383] Allocated cache and file handles database=/home/blockchain/mychain/geth/chaindata cache=16 handles=16
    5. INFO [11-04|11:59:11.411] Writing custom genesis block
    6. INFO [11-04|11:59:11.412] Persisted trie from memory database nodes=1 size=149.00B time=230.093µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
    7. INFO [11-04|11:59:11.412] Successfully wrote genesis state database=chaindata hash=481cfe…9fd026
    8. INFO [11-04|11:59:11.412] Allocated cache and file handles database=/home/blockchain/mychain/geth/lightchaindata cache=16 handles=16
    9. INFO [11-04|11:59:11.425] Writing custom genesis block
    10. INFO [11-04|11:59:11.426] Persisted trie from memory database nodes=1 size=149.00B time=1.090266ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
    11. INFO [11-04|11:59:11.427] Successfully wrote genesis state database=lightchaindata hash=481cfe…9fd026

     查看生成的mychain目录结构 

    1. [root@localhost rungeth]# tree
    2. .
    3. ├── data
    4. │   ├── geth
    5. │   │   ├── chaindata
    6. │   │   │   ├── 000001.log
    7. │   │   │   ├── CURRENT
    8. │   │   │   ├── LOCK
    9. │   │   │   ├── LOG
    10. │   │   │   └── MANIFEST-000000
    11. │   │   └── lightchaindata
    12. │   │   ├── 000001.log
    13. │   │   ├── CURRENT
    14. │   │   ├── LOCK
    15. │   │   ├── LOG
    16. │   │   └── MANIFEST-000000
    17. │   └── keystore
    18. └── genesis.json
    19. 5 directories, 11 files

    4.测试基本的操作

    1)此时再查看余额,可以看到

    1. > eth.accounts
    2. ["0x12844bb3206f10a331557bffb7c8d34ee4ca8b65", "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"]
    3. > eth.getBalance(eth.accounts[0])
    4. 999000000000000000000

    2)转账

    1. > a1=eth.accounts[0]
    2. "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
    3. > a2=eth.accounts[1]
    4. "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"
    5. 我们从账户a110个以太币给a2
    6. 转账之前需要先对账户a1解锁
    7. > personal.unlockAccount(a1,"123456")
    8. true

    转账

    1. > eth.sendTransaction({from:a1, to:a2, value:web3.toWei(10,"ether")})
    2. INFO [11-04|12:28:37.209] Setting new local account address=0x12844bB3206F10A331557bFfB7c8D34eE4ca8b65
    3. INFO [11-04|12:28:37.210] Submitted transaction fullhash=0x21d4e590f240322b2ab16b750f6e7ded187242ecdfb17c49cb5d229649f1bc56 recipient=0xA6fAA81cAD6A3b038D9a51DB80CEDbe65184c7E2
    4. "0x21d4e590f240322b2ab16b750f6e7ded187242ecdfb17c49cb5d229649f1bc56"

    交易已经成功执行,最后一排即是交易的hash值
    那我们再来看一下两个账户的余额

    1. > eth.getBalance(a1)
    2. 999000000000000000000
    3. > eth.getBalance(a2)
    4. 0

    奇怪,为什么账户的余额根本就没有变呢。那是因为这里没有矿工参与,所以也没有人来将交易打包写入区块。

    3)启动节点

    (1)最简模式开启(使用本地数据启动控制台)

    此方式启动看日志比较方便:

    1. geth --datadir "./mychain" --networkid 666 --http --http.addr 0.0.0.0 --http.vhosts "" --http.api "db,net,eth,web3,personal" --http.corsdomain "*" --snapshot=false --mine --miner.threads 1 --miner.etherbase "0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff" --allow-insecure-unlock
    2. #geth --datadir "./mychain" --networkid 6666 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,admin,ssh,txpool,debug,miner" --nodiscover --maxpeers 30 --mine --minerthreads 1 --etherbase "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65" console
    参数说明:
    1、--ethash.cachedir "D:\BlockChain\Ethash":指定 Ethash 缓存目录的路径。
    2、--ethash.dagdir "D:\BlockChain\Ethash":指定 Ethash DAG 目录的路径。
    3、--allow-insecure-unlock:允许不安全的账户解锁方式。
    4、--unlock=0:解锁账户的索引,这里是解锁第一个账户。
    5、--password ./passwd:指定解锁账户的密码文件路径,这里是使用了名为 passwd 的文件。
    6、--networkid 776211:指定节点所在的网络 ID。
    7、--datadir "nodedata":指定节点数据存储目录的路径。
    8、--http:启用 HTTP-RPC 服务。
    9、--http.api "admin,debug,web3,eth,txpool,personal,ethash,miner,net":指定 HTTP-RPC 服务要开放的 API。
    10、--http.corsdomain="*":允许所有的来源访问 HTTP-RPC 服务。
    11、--http.port=8545:指定 HTTP-RPC 服务的端口号。
    12、--http.addr="0.0.0.0":指定 HTTP-RPC 服务绑定的 IP 地址。
    13、--ws:启用 WebSocket-RPC 服务。
    14、--ws.addr "0.0.0.0":指定 WebSocket-RPC 服务绑定的 IP 地址。
    15、--ws.port=8546:指定 WebSocket-RPC 服务的端口号。
    16、--ws.origins "*":允许所有来源访问 WebSocket-RPC 服务。
    17、--ws.api "admin,debug,web3,eth,txpool,personal,ethash,miner,net":指定 WebSocket-RPC 服务要开放的 API。
    18、--syncmode full:指定节点同步模式为完整模式,即下载所有区块。
    19、console:启动控制台模式,可以在控制台中输入 Geth 命令与节点进行交互。
    上述参数大家也可以据自己的需求和环境来适当地修改这些参数和选项,确保节点的启动和运行是正确的和安全的。

    在这里插入图片描述

    (2)连接节点

    此方式默认使用的是data目录中的geth.ipc文件协助访问,只有geth.ipc文件存在才可以使用这种方式。

    1. [root@localhost rungeth]# geth attach --datadir ./data
    2. Welcome to the Geth JavaScript console!instance: Geth/v1.9.10-stable-58cf5686/linux-amd64/go1.13.6
    3. at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /usr/local/geth-alltools/rungeth/datamodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0>

    (3)使用脚本启动

    将启动命令生成一个脚本.sh文件,脚本内容如下:

    #!/bin/bash

    geth --datadir ./data --networkid 18 --port 30303 --rpc --rpcport 8545 --rpcapi 'db,net,eth,web3,personal' --rpccorsdomain "*" --gasprice 0 --allow-insecure-unlock console 2>1.log

    1. [root@localhost rungeth]# vi rungeth.sh #生成脚本文件,将上面内容拷贝到文件中
    2. [root@localhost rungeth]# ls #查看当前目录是否生成了脚本文件
    3. data genesis.json rungeth.sh
    4. [root@localhost rungeth]# ./rungeth.sh #执行脚本
    5. -bash: ./rungeth.sh: Permission denied #发现没有权限
    6. [root@localhost rungeth]# chmod 777 rungeth.sh #为脚本设置可执行权限
    7. [root@localhost rungeth]# ./rungeth.sh #再次执行脚本,成功启动Geth
    8. Welcome to the Geth JavaScript console!instance: Geth/v1.9.10-stable-58cf5686/linux-amd64/go1.13.6
    9. at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)datadir: /usr/local/geth-alltools/rungeth/datamodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0>

     查看日志:打开另一个窗囗

    1. [root@localhost rungeth]# ls #查看日志文件
    2. 1.log data genesis.json rungeth.sh
    3. [root@localhost rungeth]# tail -f 1.log #查看日志内容
    4. INFO [03-24|00:41:48.949] Loaded most recent local fast block number=0 hash=c1d47d…d9ea3e td=2 age=52y11mo3w
    5. INFO [03-24|00:41:48.949] Loaded local transaction journal transactions=0 dropped=0
    6. INFO [03-24|00:41:48.949] Regenerated local transaction journal transactions=0 accounts=0
    7. INFO [03-24|00:41:48.955] Allocated fast sync bloom size=512.00MiB
    8. INFO [03-24|00:41:48.955] Initialized fast sync bloom items=0 errorrate=0.000 elapsed=32.495µs
    9. INFO [03-24|00:41:49.004] New local node record seq=2 id=c4badd74b6951c5c ip=127.0.0.1 udp=30303 tcp=30303
    10. INFO [03-24|00:41:49.006] IPC endpoint opened url=/usr/local/geth-alltools/rungeth/data/geth.ipc
    11. INFO [03-24|00:41:49.006] HTTP endpoint opened url=http://127.0.0.1:8545 cors=* vhosts=localhost
    12. INFO [03-24|00:41:49.006] Started P2P networking self=enode://84cc775b989288ae3941448d04b873208b1578b44e0241f42b3532590253bc9b649a2c42bccfcc0a4536aa2a5140e2ad0d2bf2bbcd931d151246ae026093d9f0@127.0.0.1:30303
    13. WARN [03-24|00:41:49.054] Served eth_coinbase reqid=3 t=14.01µ

     *开发者模式*

    私链之间相互转账每次都需要输入密码,而且初始情况下无币,还需要启动矿工进行挖矿,这样耽误太多的时间,这时我们就需要启动开发者模式,此模式下默认会创建一个开发者账号,此账号拥有巨额货币

    使用如下命令新开一个数据文件目录,创建开发环境私链:

    geth --datadir  "./mychain" --dev console 2>output.log

    -----tips end-------

    这样我们就成功运行了一个私有链,再稍过一会儿
    就会发现出现了斧头,说明已经开始挖矿了
    这个时候我们再来看刚刚转账后的账户余额

    1. > web3.fromWei(eth.getBalance(eth.accounts[0]))
    2. 994
    3. > web3.fromWei(eth.getBalance(eth.accounts[1]))
    4. 10

    web3.fromWei是将Wei转换成ether
    因为我们设置的矿工奖励地址是accounts[0],所以这里的账户余额是994,而不是989

    开启一个新的命令窗囗,查看端囗是否启动:

    1. [root@localhost ~]# netstat -an | grep 8545
    2. tcp 0 0 127.0.0.1:8545 0.0.0.0:* LISTEN
    3. [root@localhost ~]# netstat -an | grep 30303
    4. tcp 0 1 192.168.237.141:49550 172.105.175.190:30303 SYN_SENT
    5. tcp 0 1 192.168.237.141:46690 104.53.12.218:30303 SYN_SENT
    6. tcp 0 0 192.168.237.141:47820 52.231.165.108:30303 FIN_WAIT2
    7. tcp 0 0 192.168.237.141:55828 52.205.246.91:30303 TIME_WAIT
    8. tcp 0 1 192.168.237.141:39324 124.122.84.22:30303 SYN_SENT
    9. tcp 0 1 192.168.237.141:40006 18.132.38.236:30303 SYN_SENT
    10. tcp 0 1 192.168.237.141:53696 54.238.114.159:30303 SYN_SENT
    11. tcp 0 0 192.168.237.141:38830 195.201.167.175:30303 ESTABLISHED
    12. tcp 0 0 192.168.237.141:44082 35.158.244.151:30303 FIN_WAIT2
    13. tcp 0 1 192.168.237.141:58038 3.209.45.79:30303 SYN_SENT
    14. tcp 0 0 192.168.237.141:32990 18.138.108.67:30303 FIN_WAIT2
    15. tcp 0 1 192.168.237.141:37970 159.89.20.6:30303 SYN_SENT
    16. tcp 0 1 192.168.237.141:59454 99.234.211.9:30303 SYN_SENT
    17. tcp 0 0 192.168.237.141:52138 65.21.77.248:30303 TIME_WAIT
    18. tcp 0 1 192.168.237.141:43326 167.71.74.162:30303 SYN_SENT
    19. tcp 0 0 192.168.237.141:56296 95.179.234.37:30303 ESTABLISHED
    20. tcp 0 0 192.168.237.141:48674 13.59.52.19:30303 TIME_WAIT
    21. tcp 0 1 192.168.237.141:48778 5.1.83.226:30303 SYN_SENT
    22. tcp6 0 0 :::30303 :::* LISTEN
    23. udp6 0 0 :::30303 :::*

    4) 交易

    通过attach命令,连接一个已经启动的节点,启动JS命令环境

    geth --datadir './mychain/' attach ipc:./mychain/geth.ipc 
    

    成功进入

    1. [root@localhost blockchain]# geth --datadir './mychain/' attach ipc:./mychain/geth.ipc WARN [11-04|14:01:44.332] Sanitizing cache to Go's GC limits provided=1024 updated=324Welcome to the Geth JavaScript console!instance: Geth/v1.8.18-unstable/linux-amd64/go1.9.5coinbase: 0x12844bb3206f10a331557bffb7c8d34ee4ca8b65at block: 1 (Sun, 04 Nov 2018 12:43:43 EST)datadir: /home/blockchain/mychainmodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

    现在开始挖矿
    可以通过miner.setEtherbase(eth.accounts[0])来设置挖矿奖励地址

    1. > eth.accounts
    2. ["0x12844bb3206f10a331557bffb7c8d34ee4ca8b65", "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2", "0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"]> a2=eth.accounts[2]"0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"
    3. > a0=eth.accounts[0]
    4. "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
    5. > personal.unlockAccount(a0)
    6. Unlock account 0x12844bb3206f10a331557bffb7c8d34ee4ca8b65
    7. Passphrase: true> eth.sendTransaction({from:a0,to:a2,value:web3.toWei(20,"ether")})
    8. "0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745"

    将账户a2设置为挖矿奖励地址

    1. > miner.setEtherbase(a2)true
    2. > eth.coinbase
    3. "0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"
    4. >

    现在已经有一个未打包进区块的交易在交易池中。txpool.status返回正在等待打包的交易。pending表示已经提交还未被处理的交易

    1. > txpool.status
    2. {pending: 1,queued: 0
    3. }

    查看pending交易详情

    1. > txpool.inspect.pending
    2. {0x12844bB3206F10A331557bFfB7c8D34eE4ca8b65: {1: "0x0CDBA6A391a52155042D4709A90fBC9ed3B72F06: 20000000000000000000 wei + 90000 gas × 1000000000 wei"}
    3. }

    5)挖矿

    要使交易被处理,必须要挖矿,
    这里启动挖矿,然后等到挖到第一个区块之后就停止挖矿
     

    1. miner.start(1);
    2. admin.sleepBlocks(1);
    3. miner.stop();

    6)区块

    之前交易的hash值0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745
    得到发起交易时的详情

    eth.getTransaction("0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745")
    

    下面是交易被打包进区块时详细信息:

    eth.getTransactionReceipt("0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745")
    

    查看当前区块总数
    eth.blockNumber
    查询最新区块
    eth.getBlock(‘latest’)
    返回区块number的信息
    eth.getBlock(0)

    4远程节点管理

    重新开一台机子(当然贫困的我是重开了一个虚拟机)
    依照上面配置环境后启动节点。注意gensis.block需要一样。

    添加其他节点
    可以通过admin.addPeer()方法连接到其他节点,两个节点要想联通,必须保证网络是连接的,并且启动时指定的networkid相同。
    通过下面的命令获得另一个节点的ecode信息

    1. > admin.nodeInfo.enode
    2. "enode://c56903836723db6d643a2b9fb13e11ed30e53618606c600f7c0ebab89246d24b381df7ef6f08b19461b423b72d88d62dcbf6aa2989024093b24536633977515a@127.0.0.1:30303?discport=0"

    链接节点2:

    1. > admin.addPeer("enode://c56903836723db6d643a2b9fb13e11ed30e53618606c600f7c0ebab89246d24b381df7ef6f08b19461b423b72d88d62dcbf6aa2989024093b24536633977515a@192.168.183.137:30303?discport=0")
    2. true

    注意这里需要把ip地址改成节点2的ip地址。
    连接成功后,节点二会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块。
    查看已连接到的节点

    创世块中对应字段说明: 

    key说明
    chainId

    网络ID,区分不同的区块链网络,值为0代表以太坊主网,不要和公链的ID重复即可,后期启动私有链需要使用,只有当chainId、network、创世区块配置相同时,才是同一条链。

    homesteadBlock升级区块所在的高度,签名算法是homesteadBlock->eip150Block->eip155Block->eip158Block,从homesteadBlock之前的区块都通过homestead相关算法来验证,homesteadBlock到eip150Block之间的用eip150Block算法来验证,以此类推。

    coinbase

    一个账户地址。初始的挖矿奖励地址,挖矿收益最终归属该账户,一般我们在挖矿开始之前都会自己指定地址,所以这个参数随便填。
    difficulty挖矿难度,值越大难度越大,出块的时间越长,根据自己的需要设置。
    gasLimit创世块能够消耗gas的上限,即最多消耗的gas值;智能合约运行在EVM上,运行机器码指令,每个指令都会对应相应的gas消耗,gas与以太不是等价的,它们之前有换算关系,gas * gasPrice = ether, gasPrice是gas单价(单位wei),可以上下浮动(感觉跟市场油价一样会发生变动)。也有解释说是“预定此区块链中gas的上限。”待核实。
    nonce随机数,挖矿的时候寻找到符合条件的nonce值。64位的随机数,初始设置成0x0000000000000042 即可。
    mixhash本块的hash值,因为是创世块,所以没有hash值,初始化为0。配合nonce用于挖矿,由上一个区块的一部分生成的hash
    parentHash父块hash值,因为是创世块,所以没有父块hash值,初始化为0。 上一个区块的hash,由于是创世区块,所以填0即可。
    timestamp

    时间戳,是从1970-01-01 00:00:00开始计算以秒为单位。时间信息,设置创世区块的开始时间。

    alloc   预置资产,可以在创世时就给某此区块预置一些资产。
    extraData附加说明,根据自己的需求可填可不填。

    Geth常用参数说明

    可以通过geth -h帮助指令查看所以指令及对应功能说明,以下常用指令说明

    指令说明
    --datadir指定之前初始化的数据目录文件
    identity当前区块链的标识,即可以给它设置名字。
    --networkid区分不同的区块链网络,设置要访问的区块链网络ID,一般与初始化创世块的chainId一致,0为以太坊主网。
    --port节点之间互相通信的端囗,默认是30303
    httpgeth 1.10版本将rpc换成了http,功能相同
    --rpc开启远程调用服务,执行智能合约时连接的节点是借助于rpc服务。

    用于开启RPC通信,此功能主要是给智能合约提供通信(http的形式)。方便后面使用钱包软件进行连接。注意:这个参数在1.10的版本里已废弃,使用http来代替

    --rpcport远程服务端囗,RPC通信的端口,默认端口是8545,可以通过此参数更改端口。
    --rpcapi远程服务提供的调用函数集(db、net、eth、web3、personal等),通过此参数可以设置连接区块链的客户端,默认情况下只有eth、net、web3可以连接。
    --rpccorsdomain指定可以接收请求来源的域名列表(浏览器访问时必须开启),默认为 “*”,设置通过域名访问RPC的白名单,多个域名中间用逗号隔开【如果是使用浏览器访问,推荐配置此参数】。
    --gaspricegas的单价,单位wei
    --allow-insecure-unlock允许在Geth命令窗囗解锁账户(新版本1.9.0+增加的选项)
    --console进入管理后台(如修改rpc端囗),带此参数可以直接进入命令行模式,此模式下可以直接输入命令操作区块链上的数据,是javascrip的可执行环境。
    dev如果是开发者的话,可以使用此参数,直接在启动的时候就会创建一个开发者账户。不需要指定networkid

    geth配置中,genesis.json的几个问题

    news 2023/4/24 9:08:39

    通过geth来配置以太坊私有链,是学习以太坊的入门步骤。而其中,如何配置genesis.json,又是最关键的一步。如果在其中产生错误,有些会导致无法初期化私有链,有些却会导致在以后的学习过程中发生各种莫名其妙的错误。

    但是,现在网上能找到的配置内容,很多只适用于v1.4之前的版本,甚至连geth自身在github上的genesis.json,其中的chainId配置,也有问题。

    基于笔者自身实践,以下genesis.json可以适用于现在的geth版本(v1.6.6)

    1. {"config": {"chainId": 10,"homesteadBlock": 0,"eip155Block": 0,"eip158Block": 0},"alloc" : {},"coinbase" : "0x0000000000000000000000000000000000000000","difficulty" : "0x02000000","extraData" : "","gasLimit" : "0x2fefd8","nonce" : "0x0000000000000042","mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp" : "0x00"
    2. }

    常遇到的几个错误:

    • Fatal: invalid genesis file: missing 0x prefix for hex data:这个错误信息意思很明白,就是你的json文件中,对于16进制数据,需要加上0x前缀

    • Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。

    • Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,我们不需要把geth退回到v1.5版本,而是需要加上config部分。

    • Error: invalid sender undefined: 这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。

    PS:如果这篇文章对你有帮助,请顶一下,或者说点什么吧。

  • 相关阅读:
    【MediaSoup---源码篇】(二)Router
    解读:学习网络安全自学好还是报培训班好
    CSS 设置渐变背景 CSS 设置渐变边框
    【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环
    国科大数据挖掘期末复习——聚类分析
    基于AVR单片机的心电信号获取与分析
    前端技术-并发请求
    01_中间件
    大数据培训课程之序列化案例实操
    学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化
  • 原文地址:https://blog.csdn.net/xgocn/article/details/130334977