是否有更复杂的函数可以从 Solidity智能合约/以太坊中调用?

问题描述

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

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

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

CheatSheet Solidity

解决方法

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)以预定义的格式(通常也来自&到特定地址)侦听交易,执行关闭-chain 操作(例如生成随机数、检索 google 搜索结果或基本上任何操作),然后向您的合约发送另一笔交易,其中包含链外操作的结果。