Web3j使用教程(1)_web3j教程-程序员宅基地

技术标签: 区块链  java  以太坊  web3j  web3  

开发环境:

windows

java 17.0.1

maven 3.8.3

node 14.17.0

实验步骤:

1.启动以太坊客户端节点

安装ganache-cli(用于搭建以太坊私链),并启动ganache-cli

npm install -g ganache-cli
ganache-cli

 启动后可以看到如下信息

2.测试以太坊通用的RPC接口,获取区块,交易,余额什么的

新建一个maven项目,加上下面两个依赖

<dependency>

<groupId>org.web3j</groupId>

<artifactId>core</artifactId>

<version>4.8.7</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-simple</artifactId>

<version>1.6.6</version>

</dependency>

代码如下(暂时没有智能合约,只是简单的获取区块链信息和普通交易):

package com.example;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.*;
import org.web3j.protocol.core.methods.response.EthBlock.Block;
import org.web3j.protocol.core.methods.response.EthBlock.TransactionResult;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.Transfer;
import org.web3j.utils.Convert;
import org.web3j.utils.Convert.Unit;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

/**
 * Hello world!
 *
 */
public class App 
{
    
    public static void main( String[] args )
    {
        try {
            //连接以太坊客户端节点,可以是ganache,geth等,注意地址端口和RPC协议(ws ,http)
            Web3j web3j = Web3j.build(new HttpService("http://127.0.0.1:8545"));
            //获取客户端版本号,通常用来判断是否连接上
            Web3ClientVersion web3clientversion = web3j.web3ClientVersion().send();
            String clientVersion = web3clientversion.getWeb3ClientVersion();
            System.out.println("web3clientVersion : " + clientVersion);
            //获取节点上所有的账户,在ganache中,每个账户有100ETH,允许你用上面用户交易
            //注意绝大多数以太坊客户端节点不会允许你用它上面的账户交易,你要自己创建钱包(见后面的Cpp类main函数)
            List<String> addressList = web3j.ethAccounts().send().getAccounts();
            System.out.println("addressList : "+addressList); 
            //交易前,获取前两个账户余额
            BigInteger balance0 = web3j.ethGetBalance(addressList.get(0), DefaultBlockParameterName.LATEST).send().getBalance();
            BigInteger balance1 = web3j.ethGetBalance(addressList.get(1), DefaultBlockParameterName.LATEST).send().getBalance();
            System.out.println("before Transaction:");
            System.out.println("balance0 : " + addressList.get(0) + " : " + balance0);
            System.out.println("balance1 : " + addressList.get(1) + " : " + balance1);

            //生成交易,参数包括谁发送,发给谁,发多少,给矿工的小费等等,由于ganache允许我们操作它上面的账户,所以不用签名。
            BigInteger mynounce = web3j.ethGetTransactionCount(addressList.get(0), DefaultBlockParameterName.LATEST).send().getTransactionCount();
            BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
            BigInteger gasLimit = BigInteger.valueOf(21000);
            BigInteger value = Convert.toWei(BigDecimal.valueOf(0.5), Unit.ETHER).toBigInteger() ;
            Transaction mytesttransaction= Transaction.createEtherTransaction(addressList.get(0),mynounce, gasPrice, gasLimit, addressList.get(1),value);
            System.out.println("mytesttransaction : ");
            printTransaction(mytesttransaction);
            //发送交易,获取交易哈希
            String txhash = web3j.ethSendTransaction(mytesttransaction).send().getTransactionHash();
            System.out.println("txhash : " + txhash);
            //交易对应的收据,这个对于智能合约交易非常有用,对普通交易没多大用
            TransactionReceipt transactionReceipt = web3j.ethGetTransactionReceipt(txhash).send().getTransactionReceipt().get();
            System.out.println("transactionReceipt : " + transactionReceipt);

            //交易后的余额
            balance0 = web3j.ethGetBalance(addressList.get(0), DefaultBlockParameterName.LATEST).send().getBalance();
            balance1 = web3j.ethGetBalance(addressList.get(1), DefaultBlockParameterName.LATEST).send().getBalance();
            System.out.println("after Transaction:");
            System.out.println("balance0 : " + addressList.get(0) + " : " + balance0);
            System.out.println("balance1 : " + addressList.get(1) + " : " + balance1);

            //获取当前最新区块,并获取它上面的所有交易
            Block latestBlock = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, false).send().getBlock();
            System.out.println("latestBlock: " + latestBlock.getHash());
            //获取区块上的所有交易
            List<TransactionResult> txlist = latestBlock.getTransactions();
            System.out.println("get TransactionBy Block :" );
            for (TransactionResult transactionResult : txlist) {
                System.out.println(transactionResult.get());
            }
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
    public static void printTransaction(Transaction x) {
        //打印交易信息
        System.out.println("From:"+x.getFrom());
        System.out.println("GasLimit:"+x.getGas());
        System.out.println("Nonce:"+x.getNonce());
        System.out.println("GasPrice:"+x.getGasPrice());
        System.out.println("To:"+x.getTo());
        System.out.println("Value:"+x.getValue()); 
    }
    
}
class Cpp {
    public static void main(String[] args) {
        try {
            Web3j web3j = Web3j.build(new HttpService("http://127.0.0.1:8545"));
            //通常情况下,以太坊节点是不会让其他人用它上面的账户,我们要自己创建钱包,用自己的私钥对交易签名,
            //下面的私钥是ganache上第一个账户的私钥,虽然交易发起者和上面的交易一样,但两者本质是不同的。
            Credentials mysigner = Credentials.create("0xfd468e650d82240e739c18ea1aaa0a7316febec3e7bb056ff1437bd3d0ede99b");
            List<String> addressList = web3j.ethAccounts().send().getAccounts();
            String txhash = Transfer.sendFunds(web3j, mysigner, addressList.get(1),BigDecimal.valueOf(1.0), Unit.ETHER).send().getTransactionHash();
            System.out.println("txhash:"+txhash);
            TransactionReceipt receipt = web3j.ethGetTransactionReceipt(txhash).send().getTransactionReceipt().get();
            System.out.println(receipt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

App中main执行结果:

Cpp中main执行结果:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_50911855/article/details/123210834

智能推荐

idea报错Error:(44, 22) java: 常量字符串过长_error:(44, 20) java: 常量字符串过长-程序员宅基地

文章浏览阅读5.3k次。@[TOC](idea报错Error:(44, 22) java: 常量字符串过长)idea报错Error:(44, 22) java: 常量字符串过长找到idea——>Settings——>Build——>Compiler——>java Compiler将javac改成Eclipse..._error:(44, 20) java: 常量字符串过长

【CV with Pytorch】第 1 章 : 计算机视觉的基石_最大池化感受野机损-程序员宅基地

文章浏览阅读748次,点赞6次,收藏6次。计算机视觉处理依赖于图像和视频的特定问题集。它试图破译图像/视频中的信息,以便做出有意义的决定。就像人类解析一幅图像或一系列按顺序放置的图像并对其做出决策一样,CV 帮助机器解释和理解视觉数据。这包括对象检测、图像分类、图像恢复、场景到文本生成、超分辨率、视频分析和图像跟踪。这些问题中的每一个都以其自身的方式很重要。在并行计算的力量发挥作用后,研究与视觉相关的问题获得了很大的吸引力。深度学习建模需要高计算量和正确定义的优化框架。有一些现有框架在研究和开发人员社区中非常受欢迎。_最大池化感受野机损

录制电脑屏幕的软件哪个性价比高?这4款软件就很实用_外部屏幕录制工具都有什么-程序员宅基地

文章浏览阅读663次。在使用电脑的过程中,我们需要对它进行屏幕录制。录制电脑屏幕需要用到录屏软件,那录制电脑屏幕的软件哪个好用?小编认为接下来介绍的这4款就很不错,快来看看吧!_外部屏幕录制工具都有什么

【opencv】(5) 图像边缘检测:sobel、scharr、laplacian、canny_分别sobe边缘检测算子、laplace边缘检测算子、canny边缘检测算子对下列图像进行边-程序员宅基地

文章浏览阅读2.4k次,点赞6次,收藏22次。各位同学好,今天和大家分享一下图像边缘检测的几个算子,主要内容有:(1)sobel算子:cv2.Sobel();(2)scharr算子:cv2.Scharr();(3)laplacian算子:cv2.Laplacian();(4)canny算子:cv2.Canny()在开始前,我们先导入需要的库文件和图片,再定义一个图像显示函数,方便绘图。import numpy as npimport cv2# 获取图片所在文件夹filepath = 'C:\\Users\\admin\\.spyde_分别sobe边缘检测算子、laplace边缘检测算子、canny边缘检测算子对下列图像进行边

python保存图片到指定路径_如何使用Python PIL(枕头)将图像保存在特定的文件目录中,而不会由于以下原因而发生KeyError:save_handler = SAVE [format.up...-程序员宅基地

文章浏览阅读1.3k次。I am trying to crop specific elements out of a larger image of the periodic table, then saving them in a specific file directory, this file directory is inside an additional folder, and this folder is..._python中numpy后保存图片到自定义路径

计算机基础一(计算机的数制)_数制数据在计算机内怎么表示与处理-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏10次。数制:人们在日常生活实践中,创造了多种表示数的方法,这些数的表示规则就被称为数制。数制的分类十进制基数为10,即逢十进一。由 0、1、2、3、4、5、6、7、8、9 十个数字组成。二进制基数为2,即逢二进一。由 0、1 两个数字组成。以0b开头。二进制是计算机中使用的数制,即所有的数据信息在计算机内部都是以二进制的形式来表示和处理的。计算机中使用二进制是因为二进制具有:可行性、简易性、逻辑性、可靠性的特点。二进制的弊端在于数字冗长、不便阅读。因此在计算机文献中常以八进制和十六进制表示。_数制数据在计算机内怎么表示与处理

随便推点

crypto-js 加密解密_cryptojs.aes.encrypt(srcs, keys, { mode: cryptojs.-程序员宅基地

文章浏览阅读479次。npm 包管理详解pm install module_name -S 即npm install module_name --save 写入dependencies npm install module_name -D即npm install module_name --save-dev 写入devDependencies npm install mo..._cryptojs.aes.encrypt(srcs, keys, { mode: cryptojs.mode.ecb, padding: cryptoj

Serv-U换端口配置成功_serv-u6.0设置新端口号-程序员宅基地

文章浏览阅读5k次。列服务器为10.0.0.6在Serv-U本地服务器的设置->高级可以设置PASV端口范围我这里设置的是2000-2000然后在域的那儿设置“FTP端口号为3000"然后firewall 打开这些端口利用filezillia设置连接,只能连接成功但无法列出目录但得用服务器内网的其他机器,列如10.0.0.3可以连接到10.0.0.6用ftp也可以用FTP overssl(显式加密)也可以外网为什么就_serv-u6.0设置新端口号

各种实用配置,代理,修改源-程序员宅基地

文章浏览阅读511次,点赞7次,收藏8次。二、python包下载设置代理指定下载源清华源:豆瓣源:设置超时离线安装

java.lang.ClassNotFoundException:org.apache.commons.beanutils.BeanUtils_java.lang.noclassdeffounderror: org/apache/commons-程序员宅基地

文章浏览阅读834次。java.lang.ClassNotFoundException:org.apache.commons.beanutils.BeanUtilsjava.lang.NoClassDefFoundError:org/apache/commons/beanutils/BeanUtils这两个异常虽然不一样,但原因都是jar包的问题解决办法在src和web下的lib包中都要导入jar包..._java.lang.noclassdeffounderror: org/apache/commons/beanutils/beanutils

国产安全芯片,请关注他们!_acl16 pack-程序员宅基地

文章浏览阅读2.4k次。北京中电华大电子设计有限责任公司 (简称“华大电子”)成立于2002年6月,是国家认定的高新技术企业,是国内最早的集成电路设计企业之一,是中国安全芯片产业的核心企业。华大电子致力于物联网、车联网、智能交通、智能家居、智能制造、5G网络通讯、金融科技等领域的安全芯片产品及应用方案开发。华大电子秉承“积极主动 追求成功”的理念,面向蓬勃发展的中国新一代信息技术产业,提供“芯”产品和“芯”方案,与产业界融合发展,共同成就美好“芯”未来。1.2.1 智能卡芯片。_acl16 pack

X11 qt5.6.2 程序运行一段时间后卡死/不刷新/(死机)(_XReply)_libx11 qt卡死-程序员宅基地

文章浏览阅读3.8k次,点赞11次,收藏25次。X11 qt5.6.2 程序运行一段时间后卡死/不刷新/(死机)硬件:飞凌 imx6dl 开发板软件:linux 4.1.15 X11 qt5.6.2问题的现象:QT应用程序运行一段时间后会卡死(界面不刷新), 此时, top命令可以看到程序进程还在,cpu占用率为0 (图中Impella进程), 复现时间间隔不固定,可能量到三小时,或者一到两天。问题debug了 很久,基于对开发板厂商的信息, 一开始 怀疑QT 程序内有死锁,或陷入睡眠,死循环等。测试发现死锁或者睡眠,的现象与问题_libx11 qt卡死

推荐文章

热门文章

相关标签