Java基于Geth1.8实现节点同步、合约部署,以及踩坑记录—主节点控制台卡死、节点同步出错的解决方案

前言:本文将从一个区块链入门小白的视角,来一步步的讲解如何实现区块链数据上链,链上数据查询,geth多节点同步。以及讲解在上链过程中,我踩过的坑及其解决方案。如果有不对的地方,还请大佬指教!🙇‍🙇‍🙇‍
声明:本文为作者Huathy原创文章,未经许可,禁止转载。否则依法追究责任!

文章目录

  • 环境搭建
    • GoLang环境安装
    • Geth环境安装
    • geth初始化
    • 启动节点
    • Geth节点同步
      • 主节点控制台卡死、无法退出问题
  • 部署智能合约
    • 编写合约代码MyContract.sol
    • 将智能合约转为Java代码
    • 智能合约Java代理类使用

环境搭建

GoLang环境安装

  1. 版本安装 :https://studygolang.com/dl
    基于go1.22.0.windows-amd64.msi (60MB)稳定版本
  2. gopath配置
    Windows版本安装自动配置,或类似JavaHome配置

Geth环境安装

下载geth1.8.20版本:geth-windows-amd64-1.8.20-24d727b6.exe
配置环境变量:
在这里插入图片描述

geth初始化

  1. 编写创世区块配置文件genesis.json
    {
    	"config": {
    	  "chainId": 1,
    	  "homesteadBlock": 0,
    	  "eip150Block": 0,
    	  "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    	  "eip155Block": 0,
    	  "eip158Block": 0,
    	  "byzantiumBlock": 0,
    	  "constantinopleBlock": 0,
    	  "petersburgBlock": 0,
    	  "istanbulBlock": 0,
    	  "ethash": {}
    	},
    	"nonce": "0x0",
    	"timestamp": "0x5ddf8f3e",
    	"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    	"gasLimit": "0xffffffff",
    	"difficulty": "0x00002",
    	"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    	"coinbase": "0x0000000000000000000000000000000000000000",
    	"alloc": { },
    	"number": "0x0",
    	"gasUsed": "0x0",
    	"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
    }
    
  2. 执行初始化命令
    geth init --datadir eth_node1 C:\env\Geth\genesis.json  
    geth init --datadir eth_node2 C:\env\Geth\genesis.json  
    
    在这里插入图片描述

启动节点

geth  --datadir "eth_node1" --port 30303 --ipcdisable --networkid 23 --rpc  --rpcaddr "localhost" --rpcport "8546" --rpccorsdomain "*" --rpcapi "db,eth,net,web3" --cache 2048 --miner.threads 4 console 2 
geth  --datadir "eth_node2" --port 30304 --ipcdisable --networkid 23 --rpc  --rpcaddr "localhost" --rpcport "8547" --rpccorsdomain "*" --rpcapi "db,eth,net,web3" console 2 
# 日志重定向
geth  --datadir "eth_node1" --port 30303 --ipcdisable --networkid 23 --rpc  --rpcaddr "localhost" --rpcport "8546" --rpccorsdomain "*" --rpcapi "db,eth,net,web3" --cache 2048 --miner.threads 4 console 2>eth_node1.log
geth  --datadir "eth_node2" --port 30304 --ipcdisable --networkid 23 --rpc  --rpcaddr "localhost" --rpcport "8547" --rpccorsdomain "*" --rpcapi "db,eth,net,web3" console 2>eth_node2.log

Geth节点同步

  1. 在node1上获取enode地址
    admin.nodeInfo.enode
    
  2. node2将node1地址添加为peer
    # 将node1的enode地址添加到node2中
    admin.addPeer("enode://46de00161f2bf8995b736dfa98a94187fe72c3b4324a96741348a0708ca90be35d728941aeeedcc6349365744bec2b64bc72ec2e2e0d2858d5cbae94ae227118@127.0.0.1:30303")
    # 使用admin.peers查看
    admin.peers
    

在这里插入图片描述

  1. node1调用miner.start()开始掘金,node2开始同步
    # 新建账户
    personal.newAccount("huathy")
    # 查看账户
    eth.accounts
    # 指定掘金账户
    miner.setEtherbase("0xd8554b507a868d5d30ff3d2e14b92615c243831e")
    # 开始掘金
    miner.start()
    # 停止掘金
    miner.stop()
    # 查看同步状态
    eth.syncing 
    # 查看区块数量是否同步
    eth.blockNumber
    

在这里插入图片描述在这里插入图片描述在这里插入图片描述特别注意:同步区块时,不要关闭控制台!注意使用正常的exit命令退出!否则下次启动同步,将导致程序退出,同步失败!

主节点控制台卡死、无法退出问题

先在节点2执行exit命令,正常退出节点2。然后直接关闭主节点控制台。但再次打开时,节点2添加peers会导致主节点异常退出。执行eth.blockNumber会发现主节点的区块数量为0。这时,我们找到主节点的文件夹,删除geth目录下的chaindata文件夹。同时将节点2的该文件夹拷贝到geth目录下。再次启动节点1、2开启同步,可见区块数量一致,同步正常。
在这里插入图片描述

部署智能合约

编写合约代码MyContract.sol

使用remix平台,编写智能合约代码https://remix.ethereum.org/
注意选择编译环境,以及复制生成的abi以及bytecode到文件MyContract.abi和MyContract.bin。

pragma solidity ^0.8.0;

contract MyContract {
    mapping(string => string) public data;

    function storeData(string memory id, string memory value) public {
        data[id] = value;
    }

    function retrieveData(string memory id) public view returns (string memory) {
        return data[id];
    }
}

在这里插入图片描述
在这里插入图片描述

将智能合约转为Java代码

  1. 创建SpringBoot项目,并引入依赖
<dependency>
	<groupId>org.web3j</groupId>
	<artifactId>geth</artifactId>
	<version>${geth.version}</version>
	<exclusions>
		<exclusion>
			<artifactId>core</artifactId>
			<groupId>org.web3j</groupId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.web3j</groupId>
	<artifactId>parity</artifactId>
	<version>${geth.version}</version>
	<exclusions>
		<exclusion>
			<artifactId>core</artifactId>
			<groupId>org.web3j</groupId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.web3j</groupId>
	<artifactId>codegen</artifactId>
	<version>5.0.0</version>
</dependency>
  1. 编写转换代码
import org.web3j.codegen.SolidityFunctionWrapperGenerator;
import java.util.Arrays;
import java.util.stream.Stream;

public class Sol2Java {
    public static void main(String[] args) {
        Sol2Java.generateClass(
                "D:\\Huathy\\Desktop\\taobao\\warehouse\\src\\main\\resources\\sol\\MyContract.abi",
                "D:\\Huathy\\Desktop\\taobao\\warehouse\\src\\main\\resources\\sol\\MyContract.bin",
                "D:\\Huathy\\Desktop\\taobao\\warehouse\\src\\main\\resources\\sol");
    }
    /**
     *
     * 生成合约的java代码
     * 其中 -p 为生成java代码的包路径此参数和 -o 参数配合使用,以便将java文件放入正确的路径当中
     * @param abiFile abi的文件路径
     * @param binFile bin的文件路径
     * @param generateFile 生成的java文件路径
     */
    public static void generateClass(String abiFile,String binFile,String generateFile){
        String[] args = Arrays.asList(
                "-a",abiFile,
                "-b",binFile,
                "-p","",
                "-o",generateFile
        ).toArray(new String[0]);
        Stream.of(args).forEach(System.out::println);
        SolidityFunctionWrapperGenerator.main(args);
    }
}

智能合约Java代理类使用

  1. 获取私钥。注意在获取的私钥前的0x
    在这里插入图片描述2. 部署合约
package com.yeqifu;

import com.yeqifu.bus.geth.MyContract;
import org.junit.Test;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.gas.DefaultGasProvider;

public class TestMyContract {
    static String nodeUrl = "http://localhost:8546"; // 连接以太坊节点,替换为实际节点URL
    static String contractAddress = "0xd8554b507a868d5d30ff3d2e14b92615c243831e";
    static String privateKey = "0xff9b62e39ec890263e586eab6e5a216c637ba1360381c9eb870ef11884a0b0a6"; // 部署者的私钥

    /**
     * 部署合约
     *
     * @throws Exception
     */
    @Test
    public void deplyContract() throws Exception {
        // RPC调用url(此处为ropsten)
        Web3j web3j = Web3j.build(new HttpService(nodeUrl));
        Credentials credentials = Credentials.create(privateKey);

        MyContract contract = MyContract.deploy(web3j, credentials, new DefaultGasProvider()).sendAsync().get();
        System.out.println("DataStore contract deployed at address: " + contract.getContractAddress());
    }
}

如果在部署过程中出现gas不足或者gas超出限制等问题,可能是由于eth余额不足,可以先进行调用矿工进行掘金。如果排查余额充足,则可能是geth版本问题,Version: 1.8.20-stable版本亲测可用。另外新版的语法于旧版本有所不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/620465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

白酒:酒精度数对白酒贮存老熟的影响研究

云仓酒庄豪迈白酒作为一种品质的白酒&#xff0c;其酒精度数对白酒贮存老熟的影响是一个值得探讨的话题。酒精度数作为白酒的一个重要参数&#xff0c;不仅决定了酒体的基本风格&#xff0c;更在很大程度上影响了白酒在贮存过程中的变化和老熟过程。 首先&#xff0c;酒精度数的…

华为配置智能无损网络综合

配置智能无损网络综合示例 适用产品和版本 安装了P系列单板的CE16800、CE6866、CE6866K、CE8851-32CQ8DQ-P、CE8851K系列交换机V300R020C00或更高版本。 安装了SAN系列单板的CE16800、CE6860-SAN、CE8850-SAN系列交换机V300R020C10或更高版本。 CE6860-HAM、CE8850-HAM系列交换…

HR人才测评:应变能力与岗位胜任力素质测评

什么是应变能力 应变能力在职场中可以说是必备的素质之一&#xff0c;它指的是从业者需要长期活动或者是行为来迎接即将到来的挑战&#xff0c;做提前的思考&#xff0c;以适应未来的挑战&#xff0c;具有随机应变的意思。在外界还未发生变化或者是已经发生变化时&#xff0c;…

python(环境安装)搭建、pycharm安装、背景改为白色详细文章

安装python环境 1、下载python安装包 Welcome to Python.org&#xff08;官网链接&#xff09; 2、点击下载、windows、python3.12.3 安装python 执行安装程序、安装选项 选择下面两项 翻译 Use admin privieges when installing py.exe是使用administrator超级管理员用户安…

MySQL从入门到高级 --- 6.函数

文章目录 第六章&#xff1a;6.函数6.1 聚合函数6.2 数学函数6.3 字符串函数6.4 日期函数6.4.1 日期格式 6.5 控制流函数6.5.1 if逻辑判断语句6.5.2 case when语句 6.6 窗口函数6.6.1 序号函数6.6.2 开窗聚合函数6.6.3 分布函数6.6.4 前后函数6.6.5 头尾函数6.6.6 其他函数6.7 …

core.sshd.xxxxxx文件过大

背景 【紧急】【应用分组】应用: 接入点服务, 分组: 观众预发, ip: xx.xx.xx.xx 【/】&#xff0c;磁盘使用率已连续2次大于90% [当前值:100%]。报警时间: 2024-05-13 14:07:01 原因 登录机器查看&#xff0c;发现根目录下有大量的崩溃文件将 / 打满 处理 1&#xff0c; 删…

SSL证书助力工业和信息化领域数据安全,确保传输数据的保密性、完整性

工业和信息化领域数据包括工业数据、电信数据和无线电数据等&#xff0c;是国家重要基础性战略资源&#xff0c;随着工业领域数字化、网络化、智能化加速提质升级&#xff0c;数据泄露、勒索攻击等网络风险日益增加&#xff0c;由此加强工业和信息化领域数据安全管理&#xff0…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.1,2,3-GPIO中断控制实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

山姆·奥特曼接受All-in Podcast采访

前言 在“All-in Podcast”播客中&#xff0c;OpenAI的CEO山姆奥特曼广泛讨论了人工智能的多个关键议题。他涉及了推理计算、开源模型的发展、GPT-5语言模型的进展&#xff0c;并对AI监管、全民基本收入&#xff08;UBI&#xff09;政策、智能体如何改变应用交互&#xff0c;以…

Springboot自动装配源码分析

版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </par…

GPT搜索鸽了!改升级GPT-4

最近OpenAI太反常&#xff0c;消息一会一变&#xff0c;直让人摸不着头脑。 奥特曼最新宣布&#xff1a;5月13日开发布会&#xff0c;不是GPT-5&#xff0c;也不是盛传的GPT搜索引擎&#xff0c;改成对ChatGP和GPT-4的升级&#xff5e; 消息一出&#xff0c;大伙儿都蒙了。 之…

【cocos creator】2.4.0 import android.support.v4.app.ActivityCompat;失败的解决方案

时间是2024年5月&#xff0c;某cocos creator项目用的是2.4.0编辑器。需求是获取录音权限&#xff0c;需要import ActivityCompat。但是失败&#xff0c;提示Cannot resolve symbol app。 尝试了一些方案失败之后&#xff0c;决定升级cocos creator编辑器版本。升级到2.4.10。…

Maven:继承和聚合

Maven高级 分模块设计和开发 如果在我们自己的项目中全部功能在同一个项目中开发,在其他项目中想要使用我们封装的组件和工具类并不方便 不方便项目的维护和管理 项目中的通用组件难以复用 所以我们需要使用分模块设计 分模块设计 在项目设计阶段,可以将大的项目拆分成若…

【快捷上手】UnrealEngine 的 关卡流 LevelStreaming 的三种加载方式

关键词&#xff1a; Unreal Engine&#xff0c;UE&#xff0c; LevelStreaming&#xff0c;动态&#xff0c;关卡&#xff0c;加载&#xff0c;切换关卡&#xff0c;换地图&#xff0c;子地图&#xff0c;子场景&#xff0c;子关卡&#xff0c;分包加载&#xff0c;动态载入 …

IT服务台的演变趋势

在技术进步和用户期望变化的推动下&#xff0c;IT服务台正在经历重大变化。IT服务台的未来将主要受到以下趋势的推动&#xff1a; 先进的人工智能和认知技术 预计高级人工智能 &#xff08;AI&#xff09; 和认知技术在 IT 服务台中的集成度会更高。通过将 IT 服务台集成到 IT…

点是否在三角形内C++源码实现

原理 思路&#xff1a; 面积和&#xff1a; abc obcaocabo,应该有更简洁的方法&#xff0c;但是这个方法思路更简单 代码实现: 注意二维向量的叉乘后&#xff0c;是垂直于平面的向量&#xff0c;相当于z为0三维向量叉乘&#xff0c;所以只有z维度有值&#xff0c;xy0. flo…

BMS-HiL系统方案设计

系统集成了业内著名 NI 公司的软硬件平台。 系统设计采用分布式设计模式。主控上位机作为整个实验的管理者主要设计软件交互和 流程管理的业务&#xff1b;下位机主要业务为序列执行与设备调用&#xff0c;各模块详细测试方案如下所示。 系统搭建使用 PXI 系统技术&#xff0c;…

98%!汽车贷款行业合成身份欺诈案激增

近年来&#xff0c;合成身份欺诈者以汽车贷款行业为最大目标&#xff0c;导致 2023 年汽车贷款行业的欺诈尝试增加了 98%&#xff0c;损失高达 79 亿美元。Point Predictive 对 1.8 亿份贷款申请的研究发现&#xff0c;收入和就业信息不实、合成身份和信用洗白几乎占汽车贷款机…

vs2017编译libjpeg的32和64位的库

1.下载libjpeg源码&#xff1a;http://www.ijg.org/files/ 2. 我下载的版本是&#xff1a;jpegsr9c.zip 3. 解压jpegsr9c.zip &#xff0c;解压目录&#xff1a;D:\libjpeg\jpeg-9c 4. 将C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include目录下的Win32.Mak文件拷贝…

netty配置SSL、netty配置https(生产环境)

netty配置SSL、netty配置https&#xff08;生产环境&#xff09; 上一篇提到了如何在开发环境使用SSL&#xff1a;https://lingkang.top/archives/netty-pei-zhi-ssl 转自&#xff1a;https://lingkang.top/archives/netty-pei-zhi-https 那么netty如何使用可信任的证书呢&a…