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

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.dtcms.com/a/282113.html

相关文章:

  • 探索阿里云DMS:解锁高效数据管理新姿势
  • 【WRFDA数据教程第一期】LITTLE_R 格式详细介绍
  • 常用 Benchmark 总结-GPT 4.1、GPT 4.5、DeepSeek模型
  • 【游戏引擎之路】登神长阶(十七):Humanoid动画——长风破浪会有时,直挂云帆济沧海
  • 联网工人安全解决方案:技术赋能下的安全新范式
  • Django REST Framework 入门指南:从 0 到 1 实现 RESTful API
  • 【LLM】OpenRouter调用Anthropic Claude上下文缓存处理
  • cudaOccupancyMaxActiveBlocksPerMultiprocessor配置内核的线程块大小
  • Linux运维新手的修炼手扎之第18天
  • 二刷 黑马点评 分布式锁-redission
  • 【芯片设计中的WDT IP:守护系统安全的电子警犬】
  • HDFS基本操作训练(创建、上传、下载、删除)
  • CSS面试题及详细答案140道之(21-40)
  • 智租换电与中国电信达成战略合作!共筑数字能源新基建
  • LeetCode|Day15|125. 验证回文串|Python刷题笔记
  • GaussDB 预写日志回收参数设置
  • Uniapp中双弹窗为什么无法显示?
  • Java虚拟机——JVM
  • uniapp各端通过webview实现互相通信
  • UniApp 多端人脸认证图片上传实现
  • AI Agent:重构智能边界的终极形态——从技术内核到未来图景全景解析
  • uniapp写好的弹窗组件
  • 【uni-ui】hbuilderx的uniapp 配置 -小程序左滑出现删除等功能
  • kafka3.6下载安装(传统架构/KRaft模式)+实例测试
  • uniapp小程序实现地图多个标记点
  • 《设计模式之禅》笔记摘录 - 7.中介者模式
  • C#中Lambda表达式与=>运算符
  • C++:Vector类核心技术解析及其模拟实现
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十二天
  • 印章标注,支持圆形、方形印章,OCR图片识别