Geth私链的多节点运行

本文详细介绍在Windows环境下安装Geth并搭建以太坊私有链的过程,包括验证私链运行状态,实现多节点运行及跨节点转账。通过在Windows和Linux下建立Geth节点连接,演示了如何确保节点间正常通信与数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一阵分别介绍了在Ubuntu和CentOS下搭建基于Geth的以太坊私链,这篇文章介绍如何搭建Geth多节点的运行。

提示:在Ubuntu和CentOS下搭建以太坊私链,请参考《在Ubuntu下使用Geth搭建自己的以太坊私有链》和《CentOS7下安装Geth,搭建以太坊私有链

一、在Windows下安装Geth

 为了方便测试,我在Windows下搭建了一个套Geth环境。安装方法比较简单,在官网 https://geth.ethereum.org/downloads/ 下载相应的安装文件,格式为exe,直接安装就可以了。我的操作系统是Windows 10专业版,安装的Geth版本为1.9.2。安装过程中如果杀毒软件报毒,请忽略。

安装完后执行cmd,打开控制台窗口,执行如下命令:

geth version

返回如下结果,表示安装成功:

二、使用remix验证私链

我们自己创建的私链是否能用呢?可以使用remix验证一下。

  • 准备工作

首先使用RPC通信方式启动私链,并在私链上创建一个用户,挖矿,确认新建的账户下有余额。

提示:具体启动私链,创建账户以及挖矿等操作,请参考《在Ubuntu下使用Geth搭建自己的以太坊私有链

  •  验证私链

在浏览器输入http://remix.ethereum.org,打开remix IDE。在左侧工具栏选择 Deploy & run transactions

然后在 Environment 中选择 Web3 Provider

在弹出框上点击OK,然后在输入框中输入本机的IP地址,通常使用默认的localhost和8545即可。

点击OK后,在左侧就可以看到私链上的账号以及账号对应的余额了。

三、多节点运行

这一节,我利用以前在Linux下创建的Geth节点和刚创建的Windows节点建立连接,实现多节点运行。

多节点运行需要注意以下几点:

  • 多节点运行要使用rpc通信方式启动私链。同时启动参数中的 nodiscover 参数很重要,它可以避免后启动的节点被先启动的节点自动扫描到,而必须由我们手动去添加节点
  • 必须使用相同的JSON配置文件初始化创始区块
  • rpcport 和 port参数必须和第一个不同
  •  启动节点

首先,分别启动两个节点,然后查看两个节点下的连接节点信息。

Linux连接节点信息如下:

Windows连接节点信息如下:

  • 添加节点

在Linux下添加Windows节点。两个节点只要有一个节点主动建立连接关系即可,另一个节点会自动获取连接关系。首先在Windows执行查看节点信息命令:

> admin.nodeInfo.enode

 然后将返回结果的字符串复制下来,在Linux下添加节点时会用到:

在Linux节点上执行添加节点命令:

> admin.addPeer()

返回true,表示添加成功

需要注意的是,由于两个节点不在同一台机子,所以执行addPeer函数时,参数字符串最后的IP地址和端口号必须是另一个节点的IP和启动端口。因为我的Linux节点安装在虚拟机上,这里我的IP是局域网地址 192.168.0.122,端口是节点启动的 port 参数指定端口 30305。

这时再分别查看两个节点下的连接节点信息,就会看到发生了变化。

Linux下的连接节点信息:

Windows下的连接节点信息:

这时,Windows节点启动挖矿,Linux节点的Log文件会有输出:

提示:需要注意的是,我的Windows节点在挖矿时,Linux节点会出现无法同步的错误,且会自动删除连接节点的信息,待Windows节点停止挖矿后,过一会自动恢复。排查后发现是由于两个系统时间不同步引起的。这个问题不知道在物理机上创建多节点环境会不会出现,大家可以注意下。

四、不同节点进行转账

这时我们可以参考《在Ubuntu下使用Geth搭建自己的以太坊私有链》文章中转账一节的方法,从Windows节点转账给Linux节点下的某个账户。我这里是从Windows节点下的第一个账户转账给Linux节点下的第二个账户。

执行转账操作并启动挖矿后,我们可以看到Linux节点下第二个账户的余额发生了变化:

提示:在Windows下转账时,需要先解锁账户。新版本的Geth出于安全考虑,默认禁止了HTTP通道解锁账户,相关issue:https://github.com/ethereum/go-ethereum/pull/17037。要解决此问题,可在启动参数中增加 --allow-insecure-unlock 。

进行geth的硬分叉需要以下步骤: 1. 编写分叉代码:编写一个智能合约,其中包括原始代码以及要执行的新代码。 2. 执行分叉代码:在运行分叉代码,以使节点能够识别新的规则。 3. 更新节点:更新参与节点,以便它们能够识别新规则并执行新代码。 4. 启动分叉:启动以执行硬分叉。 以下是更详细的步骤: 1. 编写分叉代码 首先,你需要编写一个智能合约,其中包括原始代码以及要执行的新代码。在新代码中,你需要指定要执行的新规则。 例如,如果你要创建一个新的代币,你需要指定代币的名称、符号和总量。在这个过程中,你还需要指定新规则的实现方式。 以下是一个创建新代币的示例代码: ``` pragma solidity ^0.4.16; contract MyToken { string public name; string public symbol; uint8 public decimals; uint256 public totalSupply; mapping (address => uint256) public balanceOf; mapping (address => mapping (address => uint256)) public allowance; function MyToken() public { name = "MyToken"; symbol = "MT"; decimals = 18; totalSupply = 1000000 * 10**uint256(decimals); balanceOf[msg.sender] = totalSupply; } event Transfer(address indexed from, address indexed to, uint256 value); function transfer(address _to, uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); require(balanceOf[_to] + _value >= balanceOf[_to]); balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; Transfer(msg.sender, _to, _value); return true; } function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value); require(balanceOf[_to] + _value >= balanceOf[_to]); require(_value <= allowance[_from][msg.sender]); balanceOf[_from] -= _value; balanceOf[_to] += _value; allowance[_from][msg.sender] -= _value; Transfer(_from, _to, _value); return true; } } ``` 在这个示例中,我们创建了一个名为 "MyToken" 的代币,符号为 "MT",小数点为 18,总量为 1000000。 2. 执行分叉代码 接下来,你需要在运行分叉代码,以使节点能够识别新规则。 在这个过程中,你需要将新代码添加到中。你可以使用 Remix 或 Truffle 等工具来编译和部署智能合约。 例如,你可以使用以下命令在上部署 MyToken 合约: ``` var myToken = web3.eth.contract(abi).new({from:web3.eth.accounts[0], data:bytecode, gas: 3000000}, function(e, contract){ if(!e) { if(!contract.address) { console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined! Address: " + contract.address); console.log(contract); } } }); ``` 执行以上命令后,你应该可以在上看到新的代币合约地址。 3. 更新节点 接下来,你需要更新参与节点,以便它们能够识别新规则并执行新代码。 在这个过程中,你需要将新代码添加到节点中。你可以使用以下命令将新合约添加到节点中: ``` geth attach ipc:/path/to/geth.ipc var myTokenContract = eth.contract(abi); var myToken = myTokenContract.at("0x123456..."); ``` 在以上命令中,你需要将 abi 和地址替换为你自己的值。 4. 启动分叉 最后,你需要启动以执行硬分叉。 你可以使用以下命令启动以执行硬分叉: ``` geth -- datadir /path/to/chaindata --networkid 1234 --port 30303 --rpc --rpcport 8545 --rpcaddr 127.0.0.1 --rpcapi "eth,net,web3,personal" --gasprice 0 --nodiscover --maxpeers 0 --unlock 0 --password /path/to/passwordfile.txt --mine --targetgaslimit 4700000 --fork "0x1234567890abcdef" --cache 1024 ``` 在以上命令中,你需要将 datadir、networkid、port、rpcport、rpcaddr、password 和 fork 替换为你自己的值。 这个命令将启动并执行硬分叉。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值