下面我们看一个简单的智能合约示例,我们称之为:无聊的复读机。只是为了演示 ASCH 智能合约的写法,并没有实际用处。
export class RepeaterContract extends AschContract {
holding: Mapping<bigint>
constructor() {
super()
this.holding = new Mapping<bigint>()
}
@payable({ isDefault: true })
pay(amount: bigint, currency: string): void {
assert(amount > 0, 'amount must great than 0')
assert(currency === 'XAS', 'support XAS only')
this.increaseHolding(this.context!.senderAddress, amount)
}
repeater(amount: bigint): string {
const senderAddress = this.context!.senderAddress
assert(amount > 0, 'amount must great than 0')
const remainingHolding = this.getHolding(senderAddress)
assert(remainingHolding >= amount, `holding ${remainingHolding} XAS less than ${amount}`)
this.increaseHolding(senderAddress, -amount)
return 'Hello, World!'.repeat(amount)
}
private increaseHolding(address: string, amount: bigint): void {
const holdingValue = this.holding[address] || BigInt(0)
this.holding[address] = holdingValue + BigInt(amount)
}
@constant
getHolding(address: string): bigint {
return this.holding[address] || BigInt(0)
}
}
可以看出,一个 ASCH 智能合约就是一个用 TypeScript 写的一个类!简单介绍一下这个复读机智能合约(RepeaterContract)的功能。
- pay 方法添加了 @payable 修饰器并且有 isDefault: true 参数,即表示向合约地址转账时会自动调用 pay 方法。
- repeater 是智能合约的一个公开的方法,调用时传参数 amount 表示想消耗多少 XAS,返回 amount 个 Hello, World!。
- increaseHolding 是智能合约的一个私有的方法,只能在合约内调用
- getHolding 方法被 @constant 修饰,表示这个方法是个只读方法
我们还可以看出,这个合约用到了 BigInt、assert、Mapping 等内置类型。下一小节将会讲解 ASCH 智能合约里的基本数据类型。