当前位置: 首页 > web >正文

ether.js的calldata

📌 1️⃣ 什么是 calldata?

在以太坊里,
• calldata 指的是一笔 合约调用的输入数据(Input Data)。
• 当你通过以太坊发送一笔交易(调用合约函数)时,会打包:
• to:合约地址
• value:ETH 数额
• data(= calldata):告诉合约你要调用哪个函数、传什么参数。

可以理解为:

calldata = 函数签名 + 编码后的参数

比如:

transfer(address to, uint256 amount)

如果调用:

token.transfer(“0x1234…”, 1000)

对应的 calldata 就是:

0xa9059cbb0000000000000000000000001234…00000000000000000000000000000000000000000000000000000000000003e8

其中:
• 0xa9059cbb 是 transfer(address,uint256) 的函数选择器(前 4 字节)
• 后面是 address 和 uint256 的 abi 编码。

📌 2️⃣ 在 ethers.js 里怎么用?

✅ (a) 常见情况

通常你直接调用合约函数,不需要手动管 calldata:

const contract = new ethers.Contract(tokenAddress, erc20Abi, signer);
await contract.transfer(“0x1234…”, 1000);

ethers.js 会帮你自动编码 calldata,并打包到交易里。

✅ (b) 如果你想查看 calldata

可以用 populateTransaction 或 interface.encodeFunctionData 来生成 calldata:

import { ethers } from “ethers”;

// ERC20 transfer ABI
const erc20Abi = [
“function transfer(address to, uint amount)”
];

const provider = new ethers.JsonRpcProvider(“http://localhost:8545”);
const signer = provider.getSigner();

const token = new ethers.Contract(“0xTokenAddress”, erc20Abi, signer);

// 方法1:populateTransaction
async function getCalldata() {
const txData = await token.populateTransaction.transfer(“0x1234…”, 1000);
console.log(“calldata:”, txData.data);
}

// 方法2:用 interface
const iface = new ethers.Interface(erc20Abi);
const data = iface.encodeFunctionData(“transfer”, [“0x1234…”, 1000]);
console.log(“calldata:”, data);

这样你就可以手动拿到 calldata。

✅ © 低层调用

如果你想用 sendTransaction 直接发原始交易,也需要传 data(= calldata):

const tx = await signer.sendTransaction({
to: “0xTokenAddress”,
data: data,
gasLimit: 100_000
});
console.log(“txHash:”, tx.hash);

🚀 小总结一句话
• calldata 就是告诉合约 “我调用哪个函数,参数是什么” 的二进制数据。
• 在 ethers.js 中:
• 通常你不需要管,直接调用函数就行。
• 如果需要,可以用 interface.encodeFunctionData 或 populateTransaction 来拿到它。

http://www.xdnf.cn/news/15661.html

相关文章:

  • 【基于飞浆训练车牌识别模型】
  • 【Java】【力扣】101.对称二叉树
  • Transform的重要方法
  • C++修炼:IO流
  • 关于程序=数据结构+算法这句话最近的一些思考
  • 多目标优化|HKELM混合核极限学习机+NSGAII算法工艺参数优化、工程设计优化,四目标(最大化输出y1、最小化输出y2,y3,y4),Matlab完整源码
  • WAMP允许远程访问
  • 【机器学习【6】】数据理解:数据导入、数据审查与数据可视化方法论
  • Ubuntu中man手册不全解决以及man手册中英文切换方法
  • OpenSearch SQL 查询完整指南
  • STM32-DMA
  • 数字魔方--玩转魔方的助手
  • oracle2kingbase的字段长度问题
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | AutoTextEffect(自动打字机)
  • 尚庭公寓-------图片上传接口
  • 【c++深入系列】:万字详解list(附模拟实现的list源码)
  • 【unitrix】 6.4 类型化数特征(t_number.rs)
  • JavaScript进阶篇——第六章 内置构造函数与内置方法
  • 21、鸿蒙Harmony Next开发:组件导航(Navigation)
  • 主机安全---开源wazuh安装
  • 【Unity】IL2CPP相关理论知识学习
  • Spring MVC中@PathVariable的用法详解
  • AR智能巡检:电力行业数字化转型的“加速器”
  • Java 8新特性 函数式编程实践
  • python基础②-数据结构
  • 第二十一 篇 PDF文档自动化:Python一键合并、分割、水印、提取与加密解密!你的PDF全能管家!
  • 《通信原理》学习笔记——第二章
  • 【前端】Vue3 前端项目实现动态显示当前系统时间
  • 【TVM 教程】FAQ
  • 筑牢网络安全防线:DDoS/CC 攻击全链路防护技术解析