让我们来看一下如何使用 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...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!