首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单次调用与MultiCall

单次调用与MultiCall
EN

Ethereum用户
提问于 2021-05-20 03:47:08
回答 3查看 12.1K关注 0票数 8

与单一呼叫相比,多功能到底是什么?它的好处何在?什么是多方面的合同和它的目的,我找不到任何适当的定义。

一些消息人士说,将所有调用合并到一个RPC调用中,我不知道这样做有什么好处。

EN

回答 3

Ethereum用户

发布于 2021-11-09 08:34:11

在某些情况下,您可能需要从区块链收集同步数据。一个很好的例子是询问Uniswap的象征性价格。您不希望从块x获得一个令牌的价格,而在块y中获得另一个令牌的价格。

Multicall在一个调用中将所有查询聚合到不同的契约,因此它保证从同一个块检索数据。

理解它是如何做到的是很有用的。这在原则上解释了它如何在引擎盖下工作:https://blockheroes.dev/same-block-data-querying/

票数 8
EN

Ethereum用户

发布于 2021-05-20 06:20:03

请阅读多机自述

Multicall允许将多个智能契约常量函数调用分组为单个调用,并将结果聚合为单个结果。这减少了使用像Infura这样的远程节点时需要通过网络发送的单独JSON请求的数量,并提供了所有返回的值都来自同一个块的保证。还将返回最新的块号以及聚合结果。

票数 1
EN

Ethereum用户

发布于 2022-03-31 07:06:30

当您有一个有两个功能的合同时,我们有block.timestamp,当您调用其中一个时,在调用另一个函数之后,时间就不同了,现在原因已经很清楚了,但是请看这个视频https://www.youtube.com/watch?v=PDR054Cy8qM并阅读下面的示例。

使用for循环和staticcall聚合多个查询的契约示例。

代码语言:javascript
复制
 // SPDX-License-Identifier: MIT
  pragma solidity ^0.8.10;
contract MultiCall {
function multiCall(address[] calldata targets, bytes[] calldata data)
    external
    view
    returns (bytes[] memory)
{
    require(targets.length == data.length, "target length != data length");

    bytes[] memory results = new bytes[](data.length);

    for (uint i; i < targets.length; i++) {
        (bool success, bytes memory result) = 
   targets[i].staticcall(data[i]);
        require(success, "call failed");
        results[i] = result;
    }

    return results;
 }
}

MultiCall测试合同

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

contract TestMultiCall {
function test(uint _i) external pure returns (uint) {
    return _i;
}

function getData(uint _i) external pure returns (bytes memory) {
    return abi.encodeWithSelector(this.test.selector, _i);
  }
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/99327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档