首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“通过程序集进行委托调用”的差异

“通过程序集进行委托调用”的差异
EN

Ethereum用户
提问于 2019-03-25 14:40:42
回答 1查看 1.3K关注 0票数 4

我通过程序集遇到了不同版本的delegatecall,并尝试了所有这些版本--到目前为止没有不同的结果。它们有何不同,哪一种是最好的版本?

OpenZeppelin版本:

代码语言:javascript
复制
assembly {
    let ptr := mload(0x40)
    calldatacopy(ptr, 0, calldatasize)
    let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
    let size := returndatasize
    returndatacopy(ptr, 0, size)

    switch result
    case 0 { revert(ptr, size) }
    default { return(ptr, size) }
}

MakerDAO版本:

代码语言:javascript
复制
assembly {
    let succeeded := delegatecall(sub(gas, 5000), _target, add(_calldata, 0x20), mload(_calldata), 0, 0)
    let size := returndatasize

    response := mload(0x40)
    mstore(0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f))))
    mstore(response, size)
    returndatacopy(add(response, 0x20), 0, size)

    switch iszero(succeeded)
    case 1 {
        revert(add(response, 0x20), size)
    }
}

简单版本:

代码语言:javascript
复制
assembly {
    let succeeded := delegatecall(sub(gas, 5000), _target, add(_calldata, 0x20), mload(_calldata), 0, 32)
    response := mload(0)
    switch iszero(succeeded)
    case 1 {
        revert(0, 0)
    }
}
EN

回答 1

Ethereum用户

发布于 2019-03-25 14:59:53

OpenZeppelin的一个是最通用的,并且解决了合同升级方案。它将msg.data转发给被调用的契约,并返回所谓的合同返回。

MakerDAO也是通用的,但它允许将任意bytes作为参数传递,并将返回的值打包到bytes中。

简单版本允许任意bytes作为参数,但只返回返回值的前32字节。它还忽略由失败的委托调用返回的任何数据。

票数 7
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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