我一直在努力弄清楚如何使用内联程序集(yul)进行函数调用。
例如,我有一个函数_getCurrentRate(),除了这个函数之外,我希望能够从几个不同的函数中调用。
function _getCurrentRate() public view returns (uint256 multiplier) {
assembly {
let pe := sload(periodEnd.slot)
let ps := sload(periodStart.slot)
let rate := sload(compoundRate.slot)
if lt(timestamp(), pe) {
multiplier := add(mul(sub(timestamp(), ps), rate), 1000000000000000000)
}
if iszero(lt(timestamp(), pe)) {
multiplier := 2000000000000000000
}
}
}但是,我已经翻阅了文档,无法找到任何关于如何完成这一任务的提示!我正在讨论的一个示例实现看起来类似于
function calculateSomething() public view returns (uint256 something) {
assembly {
let a := 123456789
let rate := _getCurrentRate()
something := mul(a, rate)
}
}发布于 2022-04-21 06:43:42
_getCurrentRate必须是组装块中的yul函数,这可能不是您最终想要的结果。
function calculateSomething() public view returns (uint256 something) {
assembly {
function _getCurrentRate() -> multiplier {
let pe := sload(periodEnd.slot)
let ps := sload(periodStart.slot)
let rate := sload(compoundRate.slot)
if lt(timestamp(), pe) {
multiplier := add(mul(sub(timestamp(), ps), rate), 1000000000000000000)
}
if iszero(lt(timestamp(), pe)) {
multiplier := 2000000000000000000
}
}
let a := 123456789
let rate := _getCurrentRate()
something := mul(a, rate)
}
}解决问题的一个办法是:
function calculateSomething() public view returns (uint256 something) {
uint256 rate = _getCurrentRate();
assembly {
let a := 123456789
something := mul(a, rate)
}
}https://ethereum.stackexchange.com/questions/126609
复制相似问题