一个简单的智能合约示例¶
sCrypt 中的合约在概念上类似于面向对象编程中的类。每个合约都为某种类型的合约(例如 P2PHK 或 multisig)提供了一个模板,可以将其实例化为具体的可运行合约对象。
contract Test {
int x;
constructor(int x) {
this.x = x;
}
public function equal(int y) {
require(y == this.x);
}
}
构造函数(constructor)¶
每个合约最多有一个构造函数。用于初始化合约的成员变量。 例如,它可以初始化 P2PKH 合约的公钥哈希,或哈希谜题 hash puzzle 合约的哈希秘密。
默认构造函数¶
当没有提供构造函数时,编译器将自动生成一个默认构造函数,它按照声明的顺序初始化每个成员变量。例如,
contract Test {
int x1;
bytes x2;
bool x3;
public function equal(int y) {}
}
在功能上等同于
contract Test {
int x1;
bytes x2;
bool x3;
constructor(int x1, bytes x2, bool x3) {
this.x1 = x1;
this.x2 = x2;
this.x3 = x3;
}
public function equal(int y) {}
}
require() 语句¶
require()
函数指定合约的限制条款/条件。它的参数是一个布尔条件表达式。如果条件表达式的值为假,合约将终止执行并失败。否则,将继续执行。
公共函数¶
每个合约至少有一个公共函数。它用 public
关键字表示并且不返回任何值。函数体对应锁定脚本,函数参数对应解锁脚本。公共函数在合约之外是可见的,并作为合约的入口点(就像 C 和 Java 中的 main 一样)。
公有函数的最后一个语句必须是 require()
。 require()
也可以出现在公有函数的其他地方。只有在被调用的公有函数执行完毕,并且所有 require()
中的条件全部被满足时,合约才算执行成功。在上面的例子中,只有 unlockingScript
(即 y
)等于 this.x
时合约才能执行成功。
公共函数可以被视为布尔数学函数。 f
是函数体,x
是函数参数。当且仅当 f(x) 返回 true 时,合约调用才会成功。

多个公共函数¶
一个合约可以有多个公共函数,代表解锁合约的不同方式。一次只能调用一个公共函数。
contract Test {
int x;
public function equal(int y) {
require(y == this.x);
}
public function smaller(int y) {
require(y < this.x);
}
public function larger(int y) {
require(y > this.x);
}
}