与单一呼叫相比,多功能到底是什么?它的好处何在?什么是多方面的合同和它的目的,我找不到任何适当的定义。
一些消息人士说,将所有调用合并到一个RPC调用中,我不知道这样做有什么好处。
发布于 2021-11-09 08:34:11
在某些情况下,您可能需要从区块链收集同步数据。一个很好的例子是询问Uniswap的象征性价格。您不希望从块x获得一个令牌的价格,而在块y中获得另一个令牌的价格。
Multicall在一个调用中将所有查询聚合到不同的契约,因此它保证从同一个块检索数据。
理解它是如何做到的是很有用的。这在原则上解释了它如何在引擎盖下工作:https://blockheroes.dev/same-block-data-querying/。
发布于 2021-05-20 06:20:03
请阅读多机自述。
Multicall允许将多个智能契约常量函数调用分组为单个调用,并将结果聚合为单个结果。这减少了使用像Infura这样的远程节点时需要通过网络发送的单独JSON请求的数量,并提供了所有返回的值都来自同一个块的保证。还将返回最新的块号以及聚合结果。
发布于 2022-03-31 07:06:30
当您有一个有两个功能的合同时,我们有block.timestamp,当您调用其中一个时,在调用另一个函数之后,时间就不同了,现在原因已经很清楚了,但是请看这个视频https://www.youtube.com/watch?v=PDR054Cy8qM并阅读下面的示例。
使用for循环和staticcall聚合多个查询的契约示例。
// 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测试合同
// 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);
}
}https://ethereum.stackexchange.com/questions/99327
复制相似问题