web3j 合约方法调用源码分析

文章目录

        • 调用方法流程
        • Function
        • RawTransaction
        • Credentials
        • signMessage
        • generateTransactionHash
        • toHexString
        • RawTransactionManager
          • 合约执行流程
        • FastRawTransactionManager
        • NoOpProcessor
        • 代码

调用方法流程
  1. 方法包括方法名,参数 返回值 (Function)
  2. 对方法进行编码(FunctionEncoder.encode)
  3. 根据none pirce limit address 方法编码 创建交易信息(RawTransaction.createTransaction)
  4. 签名交易信息 (TransactionEncoder.signMessage)
  5. 并转成16进制数据 (Numeric.toHexString)
  6. 发送交易
  7. 通过交易原数据和签名拿到hash(TransactionUtils.generateTransactionHashHexEncoded)
Function
  public Function(String name, List<Type> inputParameters, List<TypeReference<?>> outputParameters) {this.name = name;this.inputParameters = inputParameters;this.outputParameters = Utils.convert(outputParameters);}
RawTransaction
  protected RawTransaction(BigInteger nonce, BigInteger gasPrice, BigInteger gasLimit, String to, BigInteger value, String data, BigInteger gasPremium, BigInteger feeCap) {this.nonce = nonce;this.gasPrice = gasPrice;this.gasLimit = gasLimit;this.to = to;this.value = value;this.data = data != null ? Numeric.cleanHexPrefix(data) : null;this.gasPremium = gasPremium;this.feeCap = feeCap;}
Credentials
 public static Credentials create(ECKeyPair ecKeyPair) {String address = Numeric.prependHexPrefix(Keys.getAddress(ecKeyPair));return new Credentials(ecKeyPair, address);}
signMessage
 public static byte[] signMessage(RawTransaction rawTransaction, Credentials credentials) {byte[] encodedTransaction = encode(rawTransaction);Sign.SignatureData signatureData = Sign.signMessage(encodedTransaction, credentials.getEcKeyPair());return encode(rawTransaction, signatureData);}
generateTransactionHash
 public static byte[] generateTransactionHash(RawTransaction rawTransaction, Credentials credentials) {byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);return Hash.sha3(signedMessage);}
toHexString
 public static String toHexString(byte[] input) {return toHexString(input, 0, input.length, true);}public static String toHexString(byte[] input, int offset, int length, boolean withPrefix) {StringBuilder stringBuilder = new StringBuilder();if (withPrefix) {stringBuilder.append("0x");}for(int i = offset; i < offset + length; ++i) {stringBuilder.append(String.format("%02x", input[i] & 255));}return stringBuilder.toString();}
RawTransactionManager
 public EthSendTransaction sendTransaction(BigInteger gasPrice, BigInteger gasLimit, String to, String data, BigInteger value, boolean constructor) throws IOException {BigInteger nonce = this.getNonce();RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit, to, value, data);return this.signAndSend(rawTransaction);}
合约执行流程
   //1this.executeTransaction(function);//2this.executeTransaction(function, BigInteger.ZERO);//3this.executeTransaction(FunctionEncoder.encode(function), weiValue, function.getName());//4 weiValue如果是转eth就是数量 如果是调用合约方法就是datathis.executeTransaction(data, weiValue, funcName, false);//5TransactionReceipt receipt = this.send(this.contractAddress, data, weiValue, this.gasProvider.getGasPrice(funcName), this.gasProvider.getGasLimit(funcName), constructor);//6       this.transactionManager.executeTransaction(gasPrice, gasLimit, to, data, value, constructor);//7this.sendTransaction(gasPrice, gasLimit, to, data, value, constructor);
FastRawTransactionManager

维护了一个nonce 避免每次发送请求都区获取nonce
可以最大限度地减少向节点发送RPC请求的次数,从而提高交易发送的响应速度。

NoOpProcessor

使用NoOpProcessor的一个常见场景是,当我们只需要发送交易,而不关心区块事件或其他通知时,可以将其设置为事件处理器,避免不必要的事件处理开销。
这允许调用方对提交到网络的交易拥有交易哈希。

     ///使用7public  static TransactionManager getTxManager(Credentials credentials, Web3j web3j){NoOpProcessor processor = new NoOpProcessor(web3j);return new FastRawTransactionManager(web3j, credentials, processor);}///使用this.sendTransaction(gasPrice, gasLimit, to, FunctionEncoder.encode(function), BigInteger.ZERO, false);public  static String sendEthTransaction(Credentials credentials, Web3j web3j,BigInteger weiValue,BigInteger gasPrice, BigInteger gasLimit, String to){try {return getTxManager(credentials,web3j).sendTransaction(gasPrice, gasLimit, to, "", weiValue, false).getTransactionHash();} catch (IOException e) {throw new RuntimeException(e);}}
代码
@Throws(IOException::class,ExecutionException::class,InterruptedException::class
)
fun signTokenTransaction(amount: String,to: String,privateKey: String,coinAddress: String,decimals: Int,nonce: BigInteger
): Pair<String, String> {//支付的矿工费val gasPrice = getWeb3j().ethGasPrice().send().gasPriceval gasLimit = BigInteger("60000")val credentials = Credentials.create(privateKey)val amountWei =BigDecimal.TEN.pow(decimals).multiply(BigDecimal(amount)).toBigInteger()//封装转账交易val function = Function("transfer",listOf<Type<*>>(Address(to),Uint256(amountWei)), emptyList())val data = FunctionEncoder.encode(function)//签名交易val rawTransaction = RawTransaction.createTransaction(nonce,gasPrice,gasLimit,coinAddress,data)val signMessage = TransactionEncoder.signMessage(rawTransaction, credentials)val hexValue = Numeric.toHexString(signMessage)val hash = TransactionUtils.generateTransactionHashHexEncoded(rawTransaction,Credentials.create(privateKey))return hexValue to hash//广播交易
//    return getWeb3j().ethSendRawTransaction(Numeric.toHexString(signMessage)).sendAsync().get()
//        .transactionHash
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础知识(17)面向对象 1

一、面向对象的概念 1、面向对象的两个基本概念 编程语言中&#xff0c;一般有两种编程思维&#xff0c;面向过程和面向对象。 面向过程&#xff0c;看重的是解决问题的过程。 这好比我们解决日常生活问题差不多&#xff0c;分析解决问题的步骤&#xff0c;然后一步一步的解决…

MySQL 之 主从复制

1. 主配置文件&#xff08;win下是my.ini&#xff0c;linux下是my.cnf&#xff09; #mysql 服务ID,保证整个集群环境中唯一 server-id1 #mysql binlog 日志的存储路径和文件名 log-bin/var/lib/mysql/mysqlbin #错误日志,默认已经开启 #log-err #mysql的安装目录 #basedir #mys…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛&#xff0c;很幸运的获得了季军。在这把我的比赛攻略给大家分享一下&#xff0c;希望可以抛砖引玉。 赛题分析与理解 赛题背景&#xff1a; 大数据时代&#xff0c;上云已成为越来越多终端客户大数据方案的落地选择&#xff0c;阿里…

特别的时钟特别的倒计时

念念不忘的歌曲&#xff1a;Thats Why You Go Away <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

【网络】gateway 可以提供的一些功能之一 “ 提供web静态资源服务 ”

gateway 可以提供的一些功能之一 “ 提供web静态资源服务 ” 一、提供web静态资源服务1.1、web静态资源服务是什么1.2、web静态资源服务有什么作用1.3、web静态资源服务怎么实现 二、提供Restful服务器路由转发三、支持Eureka服务发现四、服务检查五、灰度发布 一、提供web静态…

测算sample gpt

测算代码 import pandas as pd import matplotlib.pyplot as pltlosspd.read_pickle("loss_8.pkl") plt.plot(loss) losspd.read_pickle("loss_16.pkl") plt.plot(loss) losspd.read_pickle("loss_4_8.pkl") plt.plot(loss) losspd.read_pickle(…

进程的概念(2)

进程优先级 1.什么的优先级 概念&#xff1a;指定进程获取某种资源&#xff08;CPU&#xff09;的先后顺序 本质&#xff1a;优先级的本质是优先级数字的大小&#xff0c;Linux中优先级数字越小&#xff0c;优先级越高 task_struct 进程控制快-> struct -> 内部字段 -&g…

Modbus转Profinet网关连接打印设备与PLC通讯

Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口&#xff0c;使得不同设备之间可以顺利进行通信。当我们需要连接打印设备与PLC进行通讯时&#xff0c;Modbus转…

pycharm 安装“通义灵码“并测试

过程&#xff1a;“File>setting>Plugins” 提示&#xff1a; 翻译之后&#xff1a; 点击"接受"之后&#xff0c;提示一下图片&#xff0c;点击ok 安装完成&#xff1a; 安装完"通义灵码"之后&#xff0c;需要登陆&#xff0c;登陆后测试 参考…

vue实现滚动条联动(一个滚动条控制两个或多个)

两个表格需要进行比对&#xff0c;两个表格是互相独立的&#xff0c;如果滚动条不能同步&#xff0c;用户就要操作两个两次&#xff0c;体验不是太好&#xff0c;如下图&#xff1a; 因此想使两个滚动条同步&#xff0c;思路如下&#xff1a; 给两个表格定义ref&#xff08;便…

uniapp微信小程序开发踩坑日记:由于图表数据渲染不出来,我第一次在项目中用watch函数监听数据变化

一、发现问题 在我们团队自己开发的微信小程序中&#xff0c;引入了Echarts图表库 然后突然有一天&#xff0c;后端队友反应图表渲染有问题。后面我去试了一下&#xff0c;确实20次里面必有一次数据渲染不出来 断定代码没问题&#xff0c;于是我们将其鉴定为玄学 二、问题原因…

VS2022 配置OpenCV开发环境详细教程

OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel开发并首先发布于1999年。OpenCV被广泛用于实时图像处理、视频分析、物体检测、面部识别、机器人视觉以及许多其他领域。它支持C、Pytho…

代码+视频,R语言绘制生存分析模型的时间依赖(相关)性roc曲线和时间依赖(相关)性cindex曲线

ROC曲线分析是用于评估一个因素预测能力的手段&#xff0c;是可以用于连续型变量分组的方法。在生存分析中&#xff0c;疾病状态和因素取值均会随时间发生变化。而标准的ROC曲线分析将个体的疾病状态和因素取值视作固定值&#xff0c;未将时间因素考虑在分析之中。在这种情况下…

selenium如何开启手机模式

在Python中使用Selenium进行网页自动化测试或爬取时&#xff0c;如果你想模拟手机模式&#xff08;即移动端浏览器模式&#xff09;&#xff0c;可以通过设置用户代理&#xff08;User-Agent&#xff09;和使用移动端的视口&#xff08;Viewport&#xff09;来实现。以下是一些…

STM32入门_江协科技_1~2_OB记录的自学笔记_STM32简介

1.综述 1.1. 课程简介 手打代码是加入了实操&#xff0c;增加学习效果&#xff1b; STM最小系统板面包板的硬件平台&#xff1b; 配套0.96寸的显示屏&#xff0c;便于调试&#xff1b; 因为使用面板板&#xff0c;所以如果程序现象不出来也有可能是硬件连接的问题&#xff1b; …

Linux 小技巧1

目录 一. 统计文件的总行数二. 获取从第二行开始的内容三. 合并两个文件为一个文件四. 统计指定列唯一值的数量五. 列出文件的绝对路径六. 获取除了空白行和注释之外的部分 一. 统计文件的总行数 ⏹非压缩文件 统计当前文件夹下csv文件的行数 wc -l ./*.csv统计指定文件夹下…

Linux下深度学习虚拟环境的搭建与模型训练

在深度学习实践中&#xff0c;环境配置是十分重要且免不了的一步。本文以 YOLOv4 模型&#xff0c;介绍在Linux下虚拟环境配置到模型训练的过程。 安装Miniconda&#xff1a; Miniconda是Anaconda的一个轻量级版本&#xff0c;非常适合用于科学计算和数据处理。 wget https:…

微信小程序 - 登录(切屏后继续倒计时)

屏幕休眠或后台运行倒计时暂停问题 updateTime: function () {let promise new Promise((resolve, reject) > {var beginTime new Date().getTime();let setTimer setInterval(() > {var newTime new Date().getTime();var dTime (newTime - beginTime) / 1000;dTim…

甘特图是什么?利用甘特图来优化项目管理流程

在现代项目管理中,图表是一种强大而直观的工具,可以帮助项目经理和团队成员清晰地了解并掌控整个项目进程。其中,甘特图是最常用和最有效的图表之一。 甘特图是一种条形图,可以用来直观地展示项目中各个任务的进度、持续时间和相互关系。它由一个横轴和一个纵轴组成。横轴代表时…

基于单片机的多功能电子万年历系统

摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…