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"; // 连接以太坊节点,替换为实际节点URLstatic String contractAddress = "0xd8554b507a868d5d30ff3d2e14b92615c243831e";static String privateKey = "0xff9b62e39ec890263e586eab6e5a216c637ba1360381c9eb870ef11884a0b0a6"; // 部署者的私钥/*** 部署合约** @throws Exception*/@Testpublic 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.xdnf.cn/news/1420986.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2023愚人杯 )————被遗忘的反序列化

<?php# 当前目录中有一个txt文件哦 error_reporting(0); show_source(__FILE__); include("check.php");class EeE{public $text;public $eeee;public function __wakeup(){if ($this->text "aaaa"){echo lcfirst($this->text);}}public functi…

基于SSM+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

用迭代加深解决加成序列问题

可以看到这个最坏的结果是100层搜索&#xff0c;但是其实1 2 4 8 16 32 64 128&#xff0c;到128的话也只要8&#xff0c;所以大概只需要10几层搜索就可以解决了&#xff0c;这个时候就可以用迭代加深的方法&#xff0c;深度一点点的加&#xff0c;如果大于概深度就舍去。有人说…

解决vue3项目打包后部署后某些静态资源图片不加载问题

目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符&#xff0c;导致无…

实现stract(字符串拼接)函数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char a[80], b[80];int i, n1, n2;//填充字符串&#xff1b;printf("请输入字符串a的内…

Shell编程之循环语句之for

一.for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量名 in 取值列表 do命令序列 done 示例&#xff1a; 1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和…

【计算机网络】计算机网络体系结构

&#x1f6a9;本文已收录至专栏&#xff1a;计算机网络学习之旅 一.常见的三种结构 (1) OSI参考模型 为了使不同体系结构的计算机网络都能互连起来&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;提出了著名的开放系统互连基本参考模型&#xff0c…

若依-生成主子表

1. sql语句建表导入到数据库中&#xff1a; -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

IB 公式解析

公式 3.2. Influence Function 影响函数允许我们在移除样本时估计模型参数的变化&#xff0c;而无需实际移除数据并重新训练模型。 3.3 影响平衡加权因子 3.4 影响平衡损失 3.5 类内重加权 m代表一个批次&#xff08;batch&#xff09;的大小&#xff0c;这意味着公式对一个批…

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下&#xff0c;电商行…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

哈希(构造哈希函数)

哈希 哈希也可以叫散列 画一个哈希表 哈希冲突越多&#xff0c;哈希表效率越低。 闭散列开放定址法: 1.线性探测&#xff0c;依次往后去找下一个空位置。 2.二次探测&#xff0c;按2次方往后找空位置。 #pragma once #include<vector> #include<iostream> #i…

告别数据泥潭:PySpark性能调优的黄金法则

阿佑今天给大家带来个一张藏宝图——使用PySpark进行性能调优的黄金法则&#xff0c;从内存管理到执行计划&#xff0c;再到并行度设置&#xff0c;每一步都是提升数据处理速度的关键&#xff01; 文章目录 Python Spark 详解1. 引言2. 背景介绍2.1 大数据处理技术演变2.2 Apac…

【MySQL】SQL基本知识点DML(2)

目录 1.DML添加数据 2.DML-修改数据 &#xff08;1&#xff09;改​编辑 &#xff08;2&#xff09;删​编辑​编辑 3.DQL-基本查询 &#xff08;1&#xff09;查询多个字段​编辑​编辑​编辑 &#xff08;2&#xff09;设置别名 &#xff08;3&#xff09;去重操作 4…

月内录用,这本期刊不到2个月完成检索

无预警毕业/晋升快刊&#xff0c;该期刊2008年被WOS收录&#xff0c;现已稳定检索16年&#xff0c;进展超顺。注意&#xff01;该期刊仅剩10篇版面&#xff01;咨询Aaron编辑老师了解该刊更多信息&#xff01; 1、期刊基本信息 【期刊简介】IF&#xff1a;0-1.0&#xff0c;J…

【SpringBoot】 什么是springboot(三)?springboot使用ajax、springboot使用reids

文章目录 SpringBoot第五章第六章1、springboot使用ajax2、springboot使用reids1、单机版**使用步骤**1-5步67-9步RedisTemplate使用RedisTemplate2、集群版开启集群项目配置1234-5第七章1、springboot文件上传使用步骤1-234-52、springboot邮件发送步骤1-23453、springboot拦截…

全球首例!猪肾移植患者死亡,人类科技与伦理或将面临挑战?

全球首例猪肾移植患者的离世&#xff0c;如同一颗重磅炸弹&#xff0c;在医学界激起千层浪花&#xff0c;让原本充满希望的“死而复生”异种器官移植技术再次被推至风口浪尖。 今年3月&#xff0c;一场与命运的较量在麻省总医院悄然落幕。全球首位接受转基因猪肾移植的患者理查…

【C++】多态(上)超详细

封装&#xff0c;继承&#xff0c;多态不只是C的三大特性&#xff0c;而是面向对象编程的三大特性。 什么是多态&#xff1a; 不同的对象做同一件事情&#xff0c;结果会出现多种形态。 1.满足多态的几个条件 1.父子类完成虚函数重写&#xff08;需要满足三同&#xff1a;函…