【Solidity Yul Assembly】3.5 | Receiving contract calls

  • 0xE
  • 发布于 2024-09-03 10:30
  • 阅读 796

让我们来看一下如何使用 Yul 编写一个合约,并使其能够接受外部调用。

本文将通过两个合约示例进行演示:一个合约几乎完全使用 Yul 编写,作为被调用方;另一个是标准的 Solidity 合约,作为调用方。
以下是两个示例合约的代码:


contract CalldataDemo{
    fallback(bytes calldata data) external returns (bytes memory returnData) {
        assembly {
            let cd := calldataload(0) // always loads 32 bytes
            // d2178b0800000000000000000000000000000000000000000000000000000000
            let selector := shr(0xe0, cd) // shift right 224 bits to get the last 4 bytes(32 bits)
            // 00000000000000000000000000000000000000000000000000000000d2178b08

            // unlike other languages, switch doed not "fall through"
            switch selector
            case 0xd2178b08 /* get2() */{
                returnUint(2)
            }
            case 0xba88df04 /* get99(uint256) */ {
                returnUint(getNotSoSecretValue())
            }
            default {
                revert(0,0)
            }

            function returnUint(v) {
                mstore(0, v)
                return(0, 0x20)
            }

            function getNotSoSecretValue() -> r {
                if lt(calldatasize(), 36) {
                    revert(0,0)
                }

                let arg1 := calldataload(4)
                if eq(arg1, 8) {
                    r := 88
                    leave
                }
                r := 99
            }
        }
    }
}

interface ICalldataDemo {
    function ge...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
0xE
0xE
0x59f6...a17e
17年进入币圈,Web3 开发者。刨根问底探链上真相,品味坎坷悟 Web3 人生。有工作机会可加v:__0xE__