一个简单的智能合约示例

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 时,合约调用才会成功。

sCrypt logo

多个公共函数

一个合约可以有多个公共函数,代表解锁合约的不同方式。一次只能调用一个公共函数。

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);
    }
}