繁体   English   中英

为什么我不能让 bool 在 Solidity Assembly function 中正常工作?

[英]Why can't I get bool to work properly in Solidity Assembly function?

我正在使用 Solidity 汇编代码制作 IsPrime function。

function 接受一个数字作为参数,如果是素数则返回 true,否则返回 false。

我已经让我的 function 工作了,但我不得不在汇编代码之外做一个解决方法。

请参阅下面的代码:

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.26;

contract PrimeNumber{

    function isPrimeNumber(uint num1) public view returns(bool) {
        
        uint result = 20;  // bool result = true;
        

        assembly{
    
            for {let i := 2} lt(i, num1) {i := add(i, 1)}{
                if eq(mod(num1, i), 0) {result := 10}  // result := false
            }
        
         

        }
        if(result == 10){
            return false;
        }
        return true;  // return result;
    }
}


所以 function 可以工作,但我不能只使用 BOOL 和汇编让它正常工作。

我不得不在汇编后添加一个普通的 if/else 语句,因为我只能让结果作为 UINT 类型正常工作。

我试过 switch 语句,但出现错误“true 和 false 不是有效文字”

查看评论了解我想做什么。

在 Solidity 版本 0.6 之前, false true 我没有在文档中找到任何关于此的信息 - 只能通过尝试不同的版本来验证。

您可以使用类似 false 的值(例如 0)来绕过此限制。

pragma solidity ^0.4.26;

contract PrimeNumber{
    function isPrimeNumber(uint num1) public view returns(bool) {
        bool result = true;
        assembly{
            for {let i := 2} lt(i, num1) {i := add(i, 1)}{
                if eq(mod(num1, i), 0) {
                    result := 0
                }
            }
        }
        return result;
    }
}

注意:最新版本的 Solidity(2022 年 11 月)是 0.8.17。 因此,如果您的用例允许,我建议您使用最新版本,因为它包含错误修复和安全改进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM