Solidity 与 FunC
智能合约开发涉及使用预定义语言,如以太坊的 Solidity 和 TON 的 FunC。 Solidity 是一种面向对象、高级、严格类型的语言,受到 C++、Python 和 JavaScript 的影响,专门用于编写在以太坊区块链平台上执行的智能合约。
FunC 也是一种高级语言,用于在 TON 区块链上对智能合约进行编程,是一种特定领域的、类似 C 语言的静态类型语言。
下文将简要分析这些语言的以下方面,即数据类型、存储、函数、流程控制结构和字典(哈希图)。
存储布局
Solidity 提供一种扁平存储模型,这意味着所有状态变量都存储在称为存储空间的单个连续内存块中。存储空间是一个键值存储空间,其中每个键是一个 256 位(32 字节)整数,代表存储槽编号,每个值是存储在该槽中的 256 位字。插槽从 0 开始按顺序编号,每个插槽可存储一个字。Solidity 允许程序员使用存储关键字来定义状态变量,从而指定存储布局。定义变量的顺序决定了它们在存储空间中的位置。
TON 区块链中的永久存储数据以 cell 的形式存储。Cell 在基于堆栈的 TVM 中扮演着存储器的角色。一个 cell 可以转化为一个 slice,然后通过从 slice 中加载 cell 中的数据位和对其他 cell 的引用来获取这些数据位和引用。其他 cell 的数据位和引用可以存储到构建器中,然后将构建器最终转化为新的 cell。
数据类型
Solidity 包含以下基本数据类型:
- Signed/Unsigned integers
- Boolean
- Addresses - 用于存储以太坊钱包或智能合约地址,通常约 20 字节。地 址类型可以后缀关键字 "payable",这就限制了它只能存储钱包地址,并使用传输和发送加密功能。
- Byte arrays --用关键字 "字节 "声明,是一个固定大小的数组,用于存储预定义的字节数,最多 32 个,通常与关键字一起声明。
- Literals - 不可更改的值,如地址、有理数和整数、字符串、统一码和十六进制数,可存储在变量中。
- Enums
- Arrays (fixed/dynamic)
- Structs
- Mappings
就 FunC 而言,主要数据类型有
- Integers
- cell - TON 不透明数据结构的基本结构,包含多达 1 023 个比特和多达 4 个对其他 cell 的引用
- Slice 和 Builder - 用于读取和写入 cell 的特殊对象、
- Continuation --另一种包含可随时执行的 TVM 字节代码的 cell 类型
- Tuples - 是由最多 255 个元件组成的有序集合,具有任意值类型,可能是不同的。
- Tensors - 是一个有序集合,可用于大量赋值,如(int, int) a = (2, 4)。张量类型的一个特例是单位类型 () 。它表示函数不返回任何值,或者没有参数。
目前,FunC 不支持定义自定义类型。
另请参见
声明和使用变量
Solidity 是一种静态类型语言,这意味着每个变量的类型必须在声明时指定。
uint test = 1; // Declaring an unsigned variable of integer type
bool isActive = true; // Logical variable
string name = "Alice"; // String variable
FunC 是一种更抽象、更面向函数的语言,它支持动态类型和函数式编程风格。
(int x, int y) = (1, 2); // A tuple containing two integer variables
var z = x + y; // Dynamic variable declaration
参阅
循环
Solidity 支持 for
、while
和 do { ... } while
循环。
如果你想把一件事做 10 次,可以这样做:
uint x = 1;
for (uint i; i < 10; i++) {
x *= 2;
}
// x = 1024
而 FunC 支持repeat
、while
和do { ... } until
循环。不支持 for 循环。如果想在 Func 上执行与上述示例相同的代码,可以使用 repeat
和 while
循环。
int x = 1;
repeat(10) {
x *= 2;
}
;; x = 1024
另请参见
Functions
Solidity 在处理函数声明时,兼顾了清晰性和控制性。在这种编程语言中,每个函数都以关键字 "function "开始,然后是函数名称及其参数。函数的主体用大括号括起来,明确定义了操作范围。此外,返回值用关键字 "returns "表示。Solidity的与众不同之处在于它对函数可见性的分类--函数可以被指定为 public
, private
, internal
, 或 external
,这就决定了在什么条件下它们可以被合约的其他部分或外部实体访问和调用。下面是一个在 Solidity 语言中设置全局变量 "num "的例子:
function set(uint256 _num) public returns (bool) {
num = _num;
return true;
}
过渡到 FunC,FunC 程序本质上是函数声明/定义和全局变量声明的列表。FunC 函数声明通常以一个可选声明符开始,然后是返回类型和函数名称。接下来列出参数,最后以一系列指定符结束声明,如 "impure"、"inline/inline_ref "和 "method_id"。这些指定符可以调整函数的可见性、修改合约存储的能力以及内联行为。下面是一个例子,我们在 Func 语言中将存储变量作为 cell 存储到持久化存储中:
() save_data(int num) impure inline {
set_data(begin_cell()
.store_uint(num, 32)
.end_cell()
);
}