Skip to content

Latest commit

 

History

History
51 lines (38 loc) · 2 KB

2.1 Hello, World.md

File metadata and controls

51 lines (38 loc) · 2 KB

下面我们看一个简单的智能合约示例,我们称之为:无聊的复读机。只是为了演示 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)的功能。

  1. pay 方法添加了 @payable 修饰器并且有 isDefault: true 参数,即表示向合约地址转账时会自动调用 pay 方法。
  2. repeater 是智能合约的一个公开的方法,调用时传参数 amount 表示想消耗多少 XAS,返回 amount 个 Hello, World!。
  3. increaseHolding 是智能合约的一个私有的方法,只能在合约内调用
  4. getHolding 方法被 @constant 修饰,表示这个方法是个只读方法

我们还可以看出,这个合约用到了 BigInt、assert、Mapping 等内置类型。下一小节将会讲解 ASCH 智能合约里的基本数据类型。