跳转到内容

数学

各种数学辅助功能

min

fun min(x: Int, y: Int):Int

计算并返回两个 Intxy最小值

使用示例

min(1, 2); // 1
min(2, 2); // 2
min(007, 3); // 3
min(0x45, 3_0_0); // 69, nice
// ↑ ↑
// 69 300

max

fun max(x: Int, y: Int):Int

计算并返回两个 Intxy最大值

使用示例

max(1, 2); // 2
max(2, 2); // 2
max(007, 3); // 7
max(0x45, 3_0_0); // 300
// ↑ ↑
// 69 300

abs

fun abs(x: Int):Int

计算并返回Intx绝对值

使用示例

abs(42); // 42
abs(-42); // 42
abs(-(-(-42))); // 42

log

fun log(num: Int, base: Int):Int

计算并返回数字 num >0> 0base 1≥1 为底的 logarithm 值。 结果四舍五入。 传入一个非正数num值或base小于 11 会产生错误退出代码 5:整数超出预期范围”。

使用示例

log(1000, 10); // 3, 因为 10^3 是 1000
// ↑ ↑ ↑
// num base base num
log(1001, 10); // 3
log(999, 10); // 2
try {
log(-1000, 10);// 抛出退出代码 5,因为数值不是正数
}
log(1024, 2); // 10
try {
log(1024, -2); // 抛出退出代码 5,因为基数小于 1
}

log2

fun log2(num: Int):Int

类似于 log(),但将 base 设为 22

使用示例

log2(1024); // 10,因为 2^10 是 1024
// ↑ ↑
// num base₂ num

pow

fun pow(base: Int, exp: Int):Int

计算并返回涉及两个数的 幂级数:“基数 “和指数(或_幂_)“exp”。 指数 exp 必须是非负数,否则将产生退出代码 5错误:整数超出预期范围

请注意,该函数在运行时和[编译时](/ref/core-comptime)均有效。

使用示例

contract Example {
// 持久状态变量
p23: Int = pow(2, 3); // 将 2 提升到三次幂,即 8
oneInt = pow(5, 0); // 将 5 提升到 0 的幂次,总是产生 1
// 在编译时工作!
// 内部消息接收器,接受消息 ExtMsg
receive() {
pow(self.p23, self.one + 1); // 64,运行时也有效!
pow(0, -1); // ERROR!退出代码 5:整数超出预期范围
}
}

pow2

fun pow2(exp: Int):Int

pow() 类似,但将 base 设为 22。 在运行时和[编译时](/ref/core-comptime)均可使用。

使用示例

contract Example {
// 持久状态变量
p23: Int = pow2(3); // 将 2 提升到三次幂,即 8
oneInt = pow2(0); // 将 2 提升到 0 的幂,总是产生 1
// 在编译时工作!
// 内部消息接收器,接受消息 ExtMsg
receive() {
pow2(self.one + 1); // 4,运行时也有效!
pow2(-1); // ERROR!退出代码 5:整数超出预期范围
}
}

checkSignature

fun checkSignature(hash: Int, signature: Slice, public_key: Int):Bool

使用由 256256-bit unsigned Int表示的 “公钥 “检查 256256-bit unsigned Int”哈希 “的[Ed25519][ed]“签名”。 签名必须包含至少 512512 位数据,但只使用前 512512 位。

如果签名有效,则返回 true,否则返回 false

使用示例

message ExtMsg {
signatureSlice;
dataCell;
}
contract Showcase {
// Persistent state variables
pubInt as uint256; // 公钥为 256 位无符号 Int
// 构造函数 init(),初始化所有变量
init(pub: Int) {
self.pub = pub; // 契约初始化时存储公钥
} // 外部消息接收器接受消息 ExtMsg
// 外部消息接收器,接受消息 ExtMsg
external(msg: ExtMsg) {
let hashInt = beginCell().storeRef(msg.data).endCell().hash();
let checkBool = checkSignature(hash, msg.signature, self.pub);
// ---- ------------- --------
// ↑ ↑
// | | public_key,存储在我们的合约中
// | signature,从接收到的消息中获取
// hash,使用接收到的消息中的数据计算
// ... 后续逻辑...
}
}

checkDataSignature

fun checkDataSignature(data: Slice, signature: Slice, public_key: Int):Bool

使用 “公钥 “检查 “数据 “的[Ed25519][ed]“签名”,类似于checkSignature()。 如果 data 的位长不能被 88整除,该函数将产生错误退出代码 9:单元格下溢。 验证本身是间接进行的:根据 “数据 “的[SHA-256][sha-2] 哈希值进行验证。

如果签名有效,则返回 true,否则返回 false

使用示例

dataSlice = ...;
let signatureSlice = ...;
let publicKeyInt = ...;
let checkBool = checkSignature(data, signature, publicKey);

sha256

fun sha256(data: Slice):
fun sha256(data: String):Int

从传递的 [][片] 或 字符串数据计算[SHA-256][sha-2] 哈希值,并以 256256-bit 无符号 Int的形式返回。

如果 data 是一个 字符串,它的位数应能被 88除,如果它是一个 [][片],它也必须***没有引用(即总共最多只有 1023 位数据)。

该函数尽可能在 编译时 解析常量字符串值。

使用示例

sha256(beginCell().asSlice());
sha256("Hello, world!"); // 将在编译时解析
sha256(someVariableElsewhere); // 将尝试在编译时解析,
// 并回退到运行时评估