是否有更复杂的函数可以从 Solidity(Smart Contracts/Ethereum)中调用?

Are there more complex functions to call from within Solidity (Smart Contracts/Ethereum)?

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

我想知道是否可以编写只需要比基本算术更多一点的智能合约。

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

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

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

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

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

uint8 decimals = 18;

uint256 one  = 1000000000000000000;
uint256 half =  500000000000000000;

有一些第三方库用于计算三角函数(link), working with date time (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)以预定义的格式(通常也是从/到特定地址)侦听交易,执行链下操作(例如生成随机数,检索 google 搜索结果,或基本上任何事情),然后将另一笔交易发送到您的合约,其中包含链下操作的结果。