第六章: @method Decorator

使用 @method 装饰器来标记任何打算在链上运行的方法。

被装饰的方法只能调用同样被 @method 装饰的方法。此外,只能访问用 @prop 修饰的属性。未修饰的方法只是常规的 TypeScript 类方法。

@method 装饰器标记的方法分为两种:

1. 公共的

可以从外部调用公共 @method 方法。 如果调用在不违反 assert() 中的任何条件的情况下运行完成,则调用成功。 如果 condition 为假,函数 assert(condition: boolean, errorMsg?: string) 会抛出错误; 否则它什么都不做。 一个例子如下所示。

@method() public unlock(x: bigint) { // only succeeds if x is 1 assert(1n === x, "unequal"); }

非公共的

如果没有 public 修饰符的被 @method 装饰的方法是合约内部的,不能直接从外部交易调用。

@method() static add(x0: bigint, x1:bigint) : bigint { return x0 + x1; }

实战演习

TicTacToe 合约添加 3@method 方法:

  1. 公共 @method 方法 move() : Alice 和 Bob 各自将 X 个比特币锁定在包含上述合约的一个 UTXO 中。 接下来,他们通过调用有 2 个参数的 move() 交替玩游戏:
    • n : bigint 类型,表示在棋盘上哪个位置下棋
    • sig : Sig 类型,表示玩家的签名
  2. 非公共 @method 方法 won() : 检查是否有玩家已经赢得比赛。返回 boolean 类型,有 1 个参数:
    • play : bigint 类型,表示玩家
  3. 非公共 @method 方法 full() : 检查棋盘所有格子是否都有棋子了。 返回 boolean 类型,无参数。

move 方法 添加 assert() 断言,要求函数参数 n 必须大于等于 0n, 且小于 9n

import { prop, SmartContract, PubKey, FixedArray, fill} from "scrypt-ts";
export class TicTacToe extends SmartContract {
@prop()
alice: PubKey;
@prop()
bob: PubKey;
@prop(true)
is_alice_turn: boolean;
@prop(true)
board: FixedArray<bigint, 9>;
@prop()
static readonly EMPTY: bigint = 0n;
@prop()
static readonly ALICE: bigint = 1n;
@prop()
static readonly BOB: bigint = 2n;
constructor(alice: PubKey, bob: PubKey) {
super(...arguments);
this.alice = alice;
this.bob = bob;
this.is_alice_turn = true;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX