首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏深入浅出区块链技术

    逆向 EVM - 解析原始Calldata数据

    译文出自:登链翻译计划[1] 译者:翻译小组[2] 校对:Tiny 熊[3] 你可能想知道如何破译和读取 evm 的 calldata,然后试图读取以太坊智能合约的交易 calldata,EVM(和其他 什么是 CalldataCalldata 是我们发送给函数的编码参数,在这里是发送给以太坊虚拟机(EVM)上的智能合约。每块 calldata 有 32 个字节长(或 64 个字符)。 有两种类型的 calldata:静态和动态。 静态变量是相当简单易懂的。另一方面,动态变量则要复杂得多,这可能是你难以直观地阅读原始 calldata 的原因。 编码 Calldata 要对类型进行编码,你可以将它们传入abi.encode(parameters)方法,以生成原始 calldata。 解码 calldata 那么你有了 calldata,你如何解码它呢?

    1.8K20编辑于 2023-01-09
  • 来自专栏深入浅出区块链技术

    Solidity 0.6.9 更新,calldata 有更多用武之地

    2.storage :(链上存储空间),就是状态变量保存的位置,只要合约存在就一直存储.3.calldata :(调用数据),一个特殊只读数据位置,用来保存函数调用参数(之前仅针对外部函数)。 请注意,由于EVM不允许修改 calldata,因此无法在 calldata 变量中创建新值或将某些内容复制到 calldata变量。 on as a calldata array. = _newOwners[i]); } } 使用 calldata 变量的好处是,它不用将 calldata 数据的副本保存到内存中,并确保不会修改数组或结构(calldata 位置是只读的),因此 ,如果可以的话,请尽量使用 calldata 作为数据位置 函数的返回值中其实也可以使用 calldata 数据位置,但是无法给其分配空间。

    1.3K20发布于 2020-06-12
  • 来自专栏Miigon's Blog

    [StackOverflow] Difference between synchronous and asynchorous gRPC API

    (): void HandleRpcs() { // Spawn a new CallData instance to serve new clients. new CallData(&service_, cq_.get()); void* tag; // uniquely identifies a request. instance to serve new clients while we process // the one for this CallData. new CallData(service_, cq_); // The actual processing. as the tag. cq->Next() receives the event and returns, CallData::Proceed() deallocates the CallData

    54420编辑于 2022-10-27
  • 来自专栏Ethereum

    《纸上谈兵·solidity》第 6 课:Solidity 数据存储布局 —— memory、storage、calldata 傻傻分不清?

    错误使用 memory、storage 或 calldata 不仅影响正确性,更直接影响 gas 成本、安全性和语义一致性。 外部调用参数(只读)函数参数在 external 函数中默认使用 calldata。 return data[0]; // 不能修改 data}当你写 external 函数且带有数组参数时,推荐使用 calldata:function sum(uint[] calldata nums) 就用 calldata,尤其是 external 函数,能节省大量 Gas。 小练习实现一个函数,接受 calldata 数组,复制到 memory 并排序。编写 storage 引用和 memory 副本操作对比函数,配合 Foundry 测试验证行为。

    49110编辑于 2025-08-02
  • 来自专栏code人生

    Solidity:数据存储位置

    在 Solidity 中,有三种数据存储位置:storage、memory 和 calldata。这三者的差异主要在于它们的数据保存位置和存储周期。 3.Calldata: Calldata 用于函数参数,特别是对于 external 函数参数,这类数据只读且在函数调用期间存在。 Calldata 在 EVM 中像 memory,但不会被修改,并且在函数调用期间可访问。 x) external pure returns (uint256) { return x[1]; // calldata 用于 external 函数参数,只读属性 } } 对于外部函数参数,应优先考虑使用 calldata 来降低 gas 成本。

    74610编辑于 2024-05-28
  • 来自专栏深入浅出区块链技术

    深入Solidity数据存储位置

    Calldata calldata 相当于从船上或卡车上取出的一个集装箱。这些集装箱包含送到工厂进行加工的材料。Calldata 是只读的。 对于memory和calldata也是如此。这样的关键字指向 EVM 内存中的某个位置或从交易中进来的输入数据(=calldata)的指针。 calldata引用:总是可以直接从 calldata(= tx/message 调用的输入),或通过另一个calldata引用赋值,但它们不能从storage或memory引用赋值。 calldata 引用 Calldata 引用的行为与storage引用相同。它只能作为交易数据的引用,或者作为用calldata关键字提供的复杂类型的函数参数的引用。 简而言之,一个 calldata 类型的变量总是创建一个引用。 唯一的主要区别是,作为calldata引用的变量不能被修改,因为 calldata 是只读的。 这与storage引用恰恰相反。

    1.4K10编辑于 2022-11-07
  • 来自专栏商业模式策划

    浅谈佛萨奇2.0波场链/币安链/马蹄链智能合约系统开发技术详细及源码部署

    method, string calldata key, int256 value) public {//注意,method必须为方法签名格式,且方法签名的参数间不能有空格,例如"save(string 注意,被调合约的方法必须是方法签名样式,且方法签名的参数间不能有空格,如示例中注释所示,否则无法编译为准确的ABI类型的calldata,evm将无法识别。8.2.3. solidity执行跨合约调用时,会将参数编码为ABI格式的calldata。 method, string calldata time, string calldata name, string calldata hash) public { //CrossVMCall , _ := ctx.Arg("calldata")params := make(map[string][]byte, 1)params["data"] = calldata//执行跨虚拟机低啊用if

    68020编辑于 2022-12-15
  • 来自专栏深入浅出区块链技术

    paradigm ctf 2022 - Hint finance

    但是在具体的编写过程中,需要注意到如何正确的对 calldata 进行编码: 针对 calldata 进行编码时,要由外到内,首先编码出 approveAndCall 中传入的 data,这个 data 是调用 flashloan 的 calldata,即 data 要满足lashloan(address token, uint256 amount, bytes calldata data)这个函数; innerdata,会在 approveAndCall 里再次调用,所以 innerdata 必须是一个合法的 calldata. data, bytes calldata operatorData ) external { if (value == prevAmount userData, bytes calldata operatorData ) external {} } import ".

    1.6K20编辑于 2022-11-07
  • 来自专栏技术开发分享

    DAPP智能合约质押借贷挖矿理财系统开发案例详情

    . */ function send(address recipient, uint256 amount, bytes calldata data) external; /** data, bytes calldata operatorData ) external; /** * @dev Destoys `amount` tokens data, bytes calldata operatorData ) external; event Sent( address indexed operator userData, bytes calldata operatorData ) external; } // File: src/erc777/IERC777Sender.sol userData, bytes calldata operatorData ) external; }

    65320编辑于 2023-03-06
  • 来自专栏FreeBuf

    DeFi Saver用户的31万枚DAI是如何被盗的?

    _callData 中进行构造。 2、此时将走_exchangeType==4的逻辑,这将调用takeOrder函数并传入_callData。 3、takeOrder函数将对传入的_callData进行具体调用,因此如果持有 DAI 用户在 DAI 合约中对SaverExchange合约进行过授权,则可以通过传入的_callData调用DAI合约的 transferFrom 函数将用户的 DAI 直接转出,具体都可以在_callData中进行构造。 因此,为避免出现此类问题,建议项目方使用白名单策略对用户传入的_callData等参数进行检查,或者结合项目方具体的业务场景寻找更好的调用方式,而不是不做任何限制的进行随意调用。

    67640发布于 2020-11-06
  • 来自专栏Miigon's Blog

    [StackOverflow] C++ gRPC 异步 API 实例与优势

    () { // 创建一个新的 CallData 实例来服务新客户端 new CallData(&service_, cq_.get()); void* tag; // 唯一地识别一个请求 CallData 类的实例代表了一个完整的客户端请求周期: class CallData { public: // 输入 "service" 实例(在这里代表一个异步服务器)以及用于与 它将请求体放入 CallData 对象的 request_ 成员中(通过我们之前提供的指针),然后创建一个事件(使用指向 CallData 对象的指针 作为 tag),并 将该事件放到完成队列 cq_ CallData 的 status_ 属性此时是 PROCESS,它做了如下事情: 6.1. 创建一个新的 CallData 对象,这样在这个请求后的新请求才能被新对象处理。 6.2. cq->Next() 接收到该事件并返回,CallData::Proceed() 将 CallData 对象释放(使用 delete this;)。

    1.9K20编辑于 2022-10-27
  • 来自专栏开发Notes

    [区块链]Solidity小白菜系列进阶(二)

    一.存储位置_storage memory calldata//存储位置//storage 存储(状态变量)//memory 内存(局部变量)//calldata 和memory类似 只能够用在输入的参数中 string text; } mapping (address => MyStruct) public myStructs; function examples(uint[] calldata y,string calldata s) external returns(uint[] memory){ myStructs[msg.sender] = MyStruct({foo: 比memory的gas消耗量要更小 function set(string calldata _text) external { text = _text; } function { string text; bool completed; } Todo[] public todos; function create(string calldata

    39820编辑于 2024-12-27
  • 来自专栏深入浅出区块链技术

    BeansProtocol

    uint bytes4[] functionSelectors; } function propose( IDiamondCut.FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata, uint8 _pauseOrUnpause [] calldata crates, uint256[] calldata amounts, Claim calldata claim ) external; function propose( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata, uint8 _pauseOrUnpause ) external; function vote(uint32 bip) external

    42320编辑于 2022-05-25
  • 来自专栏深入浅出区块链技术

    ERC777 功能型代币(通证)最佳实践

    data, bytes calldata operatorData ) external; // 销毁代币 function burn(uint256 amount , bytes calldata data) external; function operatorBurn( address from, uint256 amount , bytes calldata data, bytes calldata operatorData ) external; // 发送代币事件 ( address from, address to, uint256 amount, bytes calldata data, bytes calldata operatorData data, bytes calldata operatorData ) external; } 如果接收者希望在转账时收到代币转移通知,就需要在ERC1820合约上注册及实现

    1.5K60发布于 2019-09-30
  • 来自专栏Ethereum

    《纸上谈兵·solidity》第 21 课:Gas 优化与成本分析 —— 写出便宜的智能合约

    存储变量访问 先读入 memory 变量,再多次使用 减少重复 SLOAD 成本storage vs memory vs calldata 尽量使用 calldata 作为函数参数 最便宜,避免复制 变量打包 将多个 uint128 合并到一个 uint256 使用 calldata 代替 memory// 差的写法function sum(uint256[] memory arr) external pure returns (uint256 s) { for (uint i = 0; i < arr.length; i++) { s += arr[i]; }}// 优化写法function sum(uint256[] calldata returns (uint256 s) { for (uint i = 0; i < arr.length; i++) { s += arr[i]; }}memory 会复制数组,而 calldata

    36110编辑于 2025-08-27
  • 来自专栏终有链响

    ERC1155

    时不变地发送 */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata ERC1155TokenReceiver` 钩子时保持不变发送 */ function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external; /** @notice 获取账户代币余额。 代币的ID @return _owner 所请求代币类型的余额(即每个(owner, id)的余额) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** @notice 启用或禁用第三方(“运营商

    48910编辑于 2024-07-29
  • 来自专栏区块链技术开发分享

    关于LP流动性挖矿系统开发合约部署方案详情

    (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata / 5、用指定的代币交换 ETH 币 function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata memory amounts); // 6、用 ETH 币交换指定的代币 function swapETHForExactTokens(uint amountOut, address[] calldata

    56040编辑于 2022-11-02
  • 来自专栏深入浅出区块链技术

    Meter Bridge && Qubit Bridge

    uint8 destinationChainID, uint64 depositNonce, address depositer, bytes calldata recipientAddress, // copy to destinationRecipientAddress 0xE4, // copy from calldata Bridge: function deposit(uint8 destinationDomainID, bytes32 resourceID, bytes calldata data) external msg.sender, data); } function depositETH(uint8 destinationDomainID, bytes32 resourceID, bytes calldata this), amount); } } function depositETH(bytes32 resourceID, address depositer, bytes calldata

    78510编辑于 2022-04-08
  • 来自专栏深入浅出区块链技术

    解构 Solidity 合约 #2 - 函数选择器

    什么是 calldata? 让我们看看这个 calldata 是什么。在 Remix 的调试器中打开Call Data面板,可以看到:0x18160ddd。 基本上是把我们的整个 calldata 推到堆栈中。 DIV从堆栈中消耗了两个参数,把 calldata 除以那个奇怪的0x000000001000...000数字,有效地过滤了 calldata 中除了函数签名以外的所有东西,并把它单独留在堆栈中:0x000 因为指令 59 的EQ操作码将消耗堆栈中的两个值,我们想保留70a08231的值,因为我们已经费尽心思从 calldata 中提取它。

    75230编辑于 2023-01-09
  • 来自专栏深入浅出区块链技术

    撸一个预言机(Oracle)服务,真香!— 上篇

    return bool true请求成功,false请求失败 12 */ 13function query(bytes32 queryId, address callbackAddr, string calldata callbackFUN, bytes calldata queryData) external payable returns(bool) { 14 require(msg.value >= MIN_FEE bool true请求成功,false请求失败 9 */ 10function responseBytes(bytes32 queryId, address callbackAddr, string calldata callbackFUN, uint64 stateCode, bytes calldata respData) payable external isOwner returns(bool) { 11 将查询得到的结果(uint256类型)发送给客户端 18 */ 19function responseUint256(bytes32 queryId, address callbackAddr, string calldata

    1.2K20发布于 2020-06-21
领券