为什么我无法让bool在Solidity Assembly函数中正常工作?

g6baxovj  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在使用Solidity汇编代码创建一个IsPrime函数。
该函数以一个数字作为参数,如果是质数,则返回true,否则返回false。
我已经让我的函数工作了,但是我必须在汇编代码之外做一个变通方案。
请参见下面的代码:

// 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;
    }
}

所以这个函数可以工作,但是我不能让它只使用BOOL和汇编来正常工作。
我不得不在程序集之后添加一个普通的if/else语句,因为我只能得到作为UINT类型正常工作的结果。
我尝试过switch语句,但得到错误“true和false不是有效的文字”
查看评论了解我想做的事情。

46qrfjad

46qrfjad1#

Solidity程序集在Solidity 0.6版之前无法使用truefalse文字。我在文档中没有找到任何关于此的信息-只能通过尝试不同的版本进行验证。
您可以使用类似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。因此,如果您的用例允许,我建议您使用最新版本,因为它包含错误修复和安全改进。*

相关问题