Ethereum+We3j使用小结

  由于最近的项目涉及到区块链,需要做一个使用区块链存储数据的小型系统,区块链是用ethereum搭建的,加上自己一直在学习java(是个菜鸡哈哈哈可以一起交流),所以打算用web3j来与以太坊进行数据流转,发现网上做这个的人是真的少,自己摸索过也遇到了很多坑,(在这里要感谢已经毕业的大师兄@wtlife,帮了我不少忙,祝前程似锦,冲冲冲!)所以将自己遇到的一些问题和踩过的坑都贴出来,让大家少走一点弯路。下面开始正文:

以太坊:

  以太坊的搭建这一块已经有很多前辈们写过了,这里不再赘述,仅将在学习过程中遇到的问题列出来:

  1. 创世区块写好之后对其进行初始化,这里很莫名其妙,如果直接使用以下命令初始化:
geth --datadir 文件夹名 init genesis.json 

会导致挖矿的时候长时间卡顿无法挖到区块,解决方案如下:

geth --datadir 文件夹名称 --networkid 网络号 --rpc --rpccorsdomain “*” init ./genesis.json

再给出启动节点的命令:

geth --datadir data --networkid 网络号 --rpc --rpccorsdomain “*” --nodiscover --port 16333 --rpc port 8546 console

之后正常挖矿即可,为了避免不必要的麻烦,创世区块中的gasLimit建议设置为0xffffff,即最大值。

Ethereum Wallet使用注意点:

  一般来说,自己建立的私链都是使用的默认端口即:8545,但是保不齐该端口经常被占用,所以,在使用该可视化软件部署智能合约时,为了能够正确连接到本地私链,应采用如下方式:
进入以太坊钱包的正确名命令
本质上其实就是使用rpc调用节点文件夹中的geth.ipc文件。
成功连接之后如下图所示:
在这里插入图片描述
关于以太坊钱包如何使用,网上也有详细的教程,接下来将使用Java web3j的流程做一个小结。

Web3j:

先给出测试用的智能合约代码,该部分借鉴了@littleredhat1997 的github中的一些资料,不胜感激。

pragma solidity ^0.4.24;

contract Storage{
    struct Msg{
    string userName;
    string ID;
    string violateRecord;
    uint lowPoint;
    string AdministratorName;
    }
    Msg[] violateRecords;
    uint totalMsg=0;
    
    function addMsg(string username,string ID,string violateRecord,uint lowPoint,string AdministratorName ) public{
        violateRecords.push(Msg(username,ID,violateRecord,lowPoint,AdministratorName));
    }
    // function returnTotal() view public returns (uint) {
    //     return violateRecords.length;
    // }
    function getuserName(uint id) view public returns (string){
       return violateRecords[id].userName;
    }
    function getID(uint id) view public returns (string){
        return violateRecords[id].ID;
    }
    function getviolateRecord(uint id) view public returns (string){
        return violateRecords[id].violateRecord;
    }
    function getlowPoint(uint id) view public returns (uint){
        return violateRecords[id].lowPoint;
    }
    function getAdministrator(uint id) view public returns (string){
        return violateRecords[id].AdministratorName;
    }
}
  1. 使用solc命令生成bin文件和abi文件,需要先安装solc
//如果没有安装npm 需要先安装npm
npm install solc
//会在输出目录生成abi文件和bin文件
solc Storage.sol --bin --abi --optimize - o <输出目录 -dir>/
  1. 使用web3j命令生成java文件,这一步很重要
 web3j solidity generate bin文件的绝对路径 abi文件的绝对路径 -o java文件的目标路径 -p 包名+类名
  1. 建立web3j和ethereum连接,这里我给出完整的java类,方便同学们学习
  • 使用idea编写java程序,使用maven管理web3j Jar包,pom文件的配置如下:
    <dependencies>
        <dependency>
            <groupId>org.web3j</groupId>
            <artifactId>core</artifactId>
            <version>4.2.0</version>
        </dependency>
    </dependencies>
  • 下面给出完整的与私链通信的java类
import org.web3j.crypto.CipherException;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.WalletUtils;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.RemoteCall;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.core.methods.response.Web3ClientVersion;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.gas.ContractGasProvider;

import java.io.IOException;
import java.math.BigInteger;

public class Test {


    // GAS价格
    public static BigInteger GAS_PRICE = BigInteger.valueOf(20_000_000_000L);
    // GAS上限
    public static BigInteger GAS_LIMIT = BigInteger.valueOf(4_300_000L);

    //合约文件的地址,不会查看的同学可以从将sol文件放入remix中编译获得
    public static String ADDORSEARCH_ADDR = "0xc9D1639f492807CbAeEc1ce3B178eCBB171F2Df5";


    public static void main(String[] args) throws Exception {
		//建立web3j连接,监听私链端口
        Web3j web3  = Web3j.build(new HttpService("http://localhost:8547"));
        Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
        String clientVersion = web3ClientVersion.getWeb3ClientVersion();
		
		//连接本地私链的节点,WU.lC(账号的密码,账号对应的钱包文件的绝对路径)
        Credentials credentials = WalletUtils.loadCredentials("12345678","/home/qiaozhi/ethereum/data1/keystore/UTC--2019-04-15T08-41-08.880520248Z--6c82e2fef78951b27a7f4c21004e1477cd876c91");
        ContractGasProvider provider = new ContractGasProvider() {
            @Override
            public BigInteger getGasPrice(String s) {
                return GAS_PRICE;
            }

            @Override
            public BigInteger getGasPrice() {
                return GAS_PRICE;
            }

            @Override
            public BigInteger getGasLimit(String s) {
                return GAS_LIMIT;
            }

            @Override
            public BigInteger getGasLimit() {
                return GAS_LIMIT;
            }
        };

       // AddorSearch addorSearch = AddorSearch.deploy(web3,credentials,GAS_PRICE,GAS_LIMIT).send();
		//该类即为使用web3j命令转换成的java类,包含了sol文件中的所有属性和方法
        AddorSearch addorSearch = AddorSearch.load(ADDORSEARCH_ADDR,web3,credentials,provider);

		//这里还未完善,sol中应该添加一个length属性,用来循环输出所存储的值
        System.out.println(addorSearch.getuserName(BigInteger.valueOf(1)).send().toString());
        System.out.println(addorSearch.getID(BigInteger.valueOf(1)).send());
        System.out.println(addorSearch.getviolateRecord(BigInteger.valueOf(1)).send());
    }

这个项目还没有完善,后期还会进行修改,最近一直在找工作,有时间会上传到我的github上,欢迎大家一起交流!^ _ ^

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值