【问题标题】:Are there more complex functions to call from within Solidity (Smart Contracts/Ethereum)?在 Solidity(智能合约/以太坊)中是否有更复杂的函数可以调用?
【发布时间】:2021-06-04 02:25:42
【问题描述】:

我想知道除了以下这些数学表达式之外,还有其他函数可以在智能合约中调用吗?喜欢数学函数,比如 pi、sin、cosine、random() 等?

我想知道是否可以编写不仅仅需要基本算术的智能合约。

以下图片来自此页面: https://docs.soliditylang.org/en/develop/cheatsheet.html#function-visibility-specifiers

【问题讨论】:

    标签: ethereum solidity smartcontracts


    【解决方案1】:

    Solidity 本身不支持在存储和内存中存储浮点数,可能是因为 EVM(以太坊虚拟机;底层)不支持它。

    它允许在某种程度上与他们合作,例如uint two = 3 / 1.5;

    所以大多数浮点运算通常是通过定义一个uint256(256 位无符号整数)数字和另一个定义十进制长度的数字来完成的。

    例如代币合约一般使用 18 位小数:

    uint8 decimals = 18;
    
    uint256 one  = 1000000000000000000;
    uint256 half =  500000000000000000;
    

    有一些第三方库用于计算三角函数 (link)、处理日期时间 (link) 和其他用例,但本机语言目前不支持其中的许多功能。


    至于生成随机数:没有原生函数,但是可以计算一些伪随机变量的模,例如block.hashblock.timestamp。请注意,这些值可以(在某种程度上)由发布当前开采区块的矿工操纵。

    不建议在使用金钱的应用程序中使用它们(几乎是大多数智能合约),因为如果激励足够大,可能会有不诚实的矿工利用先于其他人知道价值的优势网络并能够在一定程度上对其进行修改以谋取利益。

    例子:

    // a dishonest miner can publish a block with such params,
    // that will result in the condition being true
    // and their own tx to be the first one in the block that executes this function
    function win10ETH() external {
        if (uint256(blockhash(block.number)) % 12345 == 0) {
            payable(msg.sender).transfer(10 ether);
        }
    }
    

    如果您需要一个矿工无法确定的随机数,您可以使用 oracle 方法,其中外部应用程序(称为 oracle)以预定义的格式(通常也来自特定地址)监听交易,执行关闭- 链操作(例如生成随机数、检索谷歌搜索结果或基本上任何事情),然后将另一笔交易发送到您的合约,其中包含脱链操作的结果。

    【讨论】:

    • 感谢您的详细回答,从我看到的情况来看,solidity 也缺少像“while”或“for”这样的循环函数。 Solidity 语言没有 Fortran77 复杂。
    • @AndiAna 有循环whiledo {} whilefor。请注意,如果您在循环中执行某些存储操作,成本会很高(每次存储写入需要 5k gas),因此它们实际上仅用于少量有限迭代或只读函数(viewpure 状态修饰符)不消耗汽油费。
    猜你喜欢
    • 2019-04-07
    • 2018-08-09
    • 2021-02-24
    • 2021-09-02
    • 2020-03-14
    • 1970-01-01
    • 2019-05-09
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多