ubuntu 20.04.1
1.2安装配件go环境 nodejs
1.3源码安装git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth
make all //或者编译全部
这将创建一个geth go-ethereum/build/bin文件夹中的可执行文件,您可以将其移动到您想要运行的任何位置。二进制文件是独立的,不需要任何其他文件。
geth version // 查看版本号
geth -h // 指令帮助
其他安装方式
geth官方安装
2搭建私链 2.1初始化创世区块每一个区块链都从创世区块开始。当第一次使用默认设置运行Geth时,它会将主网genesis提交到数据库中。对于专用网络(非主网),通常需要不同的genesis块。
以太坊允许通过创世配置文件来初始化创世区块,也可使用选择使用内置的多个网络环境的创世配置。默认使用以太坊主网创世配置。
编写创世区块的配置文件genesis.json
。
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"clique": {
"period": 5,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "8000000",
"extradata": "0x00000000000000000000000000000000000000000000000000000000000000007df9a875a174b3bc565e6424a0050ebc1b2d1d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
根据配置用途可分为三大类:
链配置
config项是定义链配置,会影响共识协议,虽然链配置对创世影响不大,但新区块的出块规则均依赖链配置。
创世区块头信息配置
nonce:随机数,对应创世区块 Nonce 字段。
timestamp:UTC时间戳,对应创世区块 Time字段。
extraData:额外数据,对应创世区块 Extra 字段。
gasLimit:必填,燃料上限,对应创世区块 GasLimit 字段。
difficulty:必填,难度系数,对应创世区块 Difficulty 字段。搭建私有链时,需要根据情况选择合适的难度值,以便调整出块。
minHash:一个哈希值,对应创世区块的MixDigest字段。和 nonce 值一起证明在区块上已经进行了足够的计算。
coinbase:一个地址,对应创世区块的Coinbase字段。
初始账户资产配置
alloc 项是创世中初始账户资产配置。在生成创世区块时,将此数据集中的账户资产写入区块中,相当于预挖矿。这对开发测试和私有链非常好用,不需要挖矿就可以直接为任意多个账户分配资产。
使用命令
geth --datadir data init /home/yu/go-ethereum/genesis.json
进行创世区块的初始化。当前区块链网络数据存放的位置为data
目录。启动后的效果如下:
ChainId 是 EIP-155 引入的一个用来区分不同 EVM 链的一个标识。主要作用就是避免一个交易在签名之后被重复在不同的链上提交。最开始主要是为了防止以太坊交易在以太经典网络上重放或者以太经典交易在以太坊网络上重放。在以太坊网络上是从 2675000 这个区块通过 Spurious Dragon 这个硬分叉升级激活。
引入 ChainId 后,带来了哪些影响呢?
创建新的 EVM 链时,需要在 genesis 文件中指定 ChainId。这个 ChainId 最好不要和现有任何已经在公开运行的 EVM 链的 ChainId 相同,否则可以一个配置失误就误花掉一笔钱。已经被占用的 ChainId 可以通过这个查看geth官方安装。
NetworkId 主要用来在网络层标识当前的区块链网络。NetworkId 不一致的两个节点无法建立连接。
NetworkId 无法通过配置文件指定,只能通过参数 --networkid 来指定。所以我们启动自己私链节点上需要记得加上这个参数。如果不加这个参数也不指定网络类型,默认 NetworkId 的值和以太坊主网一致。
hainId 是用来防止交易在不同的以太坊同构网络进行交易重放的。主要在交易签名和验证的时候使用。NetworkId 是用来标识区块链网络的。主要在节点之间握手并相互检验的时候使用。ChainId 需要在 genesis 文件中指定,NetworkId 需要在启动参数中指定。ChainId 和 NetworkId 的值不需要相同。 2.2启动私有链使用下面的命令启动私有链。
geth --datadir data --nodiscover console 2>> geth.log
参数解释:
datadir | 当前区块链数据存放的位置 |
console | 启动命令行模式,可以在geth中执行命令 |
nodiscover | 私有链地址,关闭节点发现机制,防止加入有同样初始配置的陌生节点 |
2>> geth.log | 输出到geth.log |
最简单的启动方式。
此时进入了geth的控制台,可以执行相关的命令。在执行命令前,可以使用tail -f geth.log
监控日志输出。
新建账号,密码为”pwd“:personal.newAccount(“pwd")
查看账户:eth.accounts
查看账户余额:eth.getBalance("your account")
解锁账户:personal.unlockAccount("your account")
查看挖矿的账户:eth.coinbase
1 wei转换为ether:web3.fromWei(1, 'ether')
1 ether转换为wei:web3.toWei(1, 'ether')
发起交易:eth.sendTransaction({from : "account1", to : "account2", value : web3.toWei(1, 'ether')})
查看交易池状态:txpool.status
开始挖矿:miner.start()
停止挖矿:miner.stop()
挖到n个块的时候停止挖矿:miner.start();admin.sleepBlocks(n);miner.stop()
以太坊客户端提供了API和一组远程调用的(RPC)命令,这些命令被编码成json的格式,被叫做JSON-RPC-API。本质上,JSON-RPC API就是一个接口,允许我们编写的程序使用以太坊客户端作为网关,访问以太坊网络和区块链上的数据
RPC作为一个HTTP服务,端口设定为8545.出于安全考虑,默认情况下,只接收来自localhost的连接
要访问JSON-RPC-API,可以使用编程语言编写的专用库函数,例如javascript的web3.js
或者可以自己手动构建请求并发送/接收JSON编码的请求。
https://ethereum.org/en/developers/docs/apis/json-rpc/
2.3.1 启动时开始rpcgeth --datadir data --networkid 2020 --http --http.addr="127.0.0.1" --http.port 8545 --http.api "db,eth,net,web3" --http.corsdomain "*" --http.vhosts "*" --port 30303 --nodiscover console 2>> geth.log
参数解释
networkid | 私有链的网络id,与其它节点相连时id要一致 |
http | 开启RPC通信 |
http.addr | RPC监听地址 |
http.port | RPC监听端口,默认8545 |
http.api | 这个命令指示了允许通过RPC访问的命令。默认情况下,Geth允许web3。 |
http.corsdomain | 跨域请求 |
http.vhosts | 接收请求的域名 |
port | 工作端口,默认30303 |
注意,由于版本的原因,rpc已经被启用,rpc指令有http代替
https://geth.ethereum.org/docs/rpc/server
注意:–http.api “eth,admin,net,web3,personal,miner” 中的字符串,决定了,js console中可以执行内容!如有admin,js console就可以执行 admin.nodeInfo。没有则不可以执行!
RPC访问可以通过http://127.0.0.1:8545或http://localhost:8545
命令是以服务的形式持续运行的,需要再打开一个命令行窗口,输入:
geth attach rpc:http://127.0.0.1:8545
eth:包含一些跟 *** 作区块链相关的方法;
net:包含一些查看p2p网络状态的方法;
admin:包含一些与管理节点相关的方法;
miner:包含启动和停止挖矿的一些方法;
personal:主要包含一些管理账户的方法;
txpool:包含一些查看交易内存池的方法;
web3:包含了以上对象,还包含一些单位换算的方法。
在命令行中,使用命令admin.nodeInfo.enode
查看节点1的enode信息。
将节点1的enode最后的ip部分(127.0.0.1)换为节点1的真实ip后,在另外一个机器(称为节点2)上用同样的命令启动geth。
在节点2的命令行中使用admin.addPeer(节点1的enode信息)
命令连接到节点1。
可以通过admin.peers
命令查看连接情况:
2.4 RPC调用
按照上述命令启动geth控制台后,可以通过RPC远程调用命令。
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' http://192.168.44.131:8545
另外一种调用方式
使用postman工具,请求方式设为POST,Headers设置"Content-Type"的值为”application/json“。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)