Waves - スマートコントラクト動いたよ

内容が古い可能性があります。
参考にする場合は、公式サイト、ドキュメントも合わせて確認してください。
このブログでの最新内容は、ページ末尾の「Waves」タグから辿ってください。

WavesPlatformのTestnetにて以下二つの機能がリリースされた(リンク)

  • Smart Accounts と Smart Assets (スマコンstep1)
  • Fee Sponsoreship

投票と有効化の期間を経て利用可能となるのでTestnet上で使えるのは少し先になるが、
プライベートチェーンであればすぐに有効化できるので試してみた。

前回、Fee Sponsoreshipを確認した。
スマコンの方はコードを確認したらスマコン設定トランザクション専用のREST APIエンドポイントが用意されていないようなので、
同機能が実装してあったエンドポイントを使ってスマートコントラクトをしてみる。

留意点

テストネットで有効化されたら公式から色々紹介、説明があるっぽいので正しいやり方などはそのアナウンス待ち。

Wavesスマートコントラクトおさらい

ドキュメントはこの辺

非チューリング完全なステージ1(RIDE. SmartAccounts, SmartAssets) とチューリング完全なステージ2(RIDEON)に分けて開発される。
今回リリスースされたのは前者の方。メインネットへのリリースは7月予定(投票期間など考慮すると、実際に利用可能になるのは8月中旬と思われる)

RIDE

WavesPlatform上のスマートコントラクト開発言語。
チューリング完全でない。チューリング完全になるとRIDEONだそう。

SmartAccounts

発行トランザクションに対してスマートコントラクトが適用されるアカウント。
SetScriptTransactionでスマートコントラクトを設定する。
(たぶん)更新できる。

SmartAssets

対象のトークンで以下の操作をしようとするとき適用されるスマートコントラクト

  • TransferTransaction
  • MassTransferTransaction
  • ReissueTransaction
  • BurnTransaction

IssueTransaction(V2)でスマートコントラクトを設定する。
発行済みトークンに設定できない(ように見える)
更新できない(ように見える)

IssueTransaction = トークン発行トランザクションのこと

動作確認など

開発

Web上のIDEがある。

スマートコントラクトの記述自体はテキストエディタで可能
スマートコントラクトのテキストデータをBase58エンコーディングしたものをパラメータとして
所定のトランザクションを発行することでスマートコントラクトが有効になる。

トランザクション発行

複数のWaves Node REST APIを使って行える

  1. /utils/script/compile を使ってbase58へエンコード
  2. /transactions/sign を使って署名済みトランザクションを生成
    (ノードのウォレットに含まれるアカウントでないと署名できない)
  3. /transactions/broadcast を使ってトランザクションを発行

エンコードと署名は自前でやるのであれば不要

SetScriptTransaction

SmartAccountsの場合
例えば以下JSONを /transactions/sign に投げれば署名されたトランザクションデータがもらえる

{
  "type": 13,
  "version": 1,
  "sender": "3QPjc67xJADxYB45NapzpJHNg3VtgYqcM88",
  "script": "WzpuEpU",
  "fee": 100000
}

そのレスポンスを /transactions/broadcast へ投げればOK

  • type 13がSetScriptTransactionを示す
  • sender には送信者のアドレス
  • script にはbase58エンコードされたRIDEスマートコントラクト
  • fee にはノードに設定してあるSetScriptTransactionの手数料を設定
    (デフォルトではTransferと同じ0.001WAVES)

IssueTransaction(V2)

SmartAssetsの場合
例えば以下JSONを /transactions/sign に投げれば署名されたトランザクションデータがもらえる

{
  "type": 3,
  "sender": "3Qd83R6vspZpttKA1QoGp2uvEtZRtPWGKDQ",
  "fee": 100000000,
  "version": 2,
  "name": "SmartAsset",
  "quantity": 100000000000,
  "reissuable": true,
  "decimals": 8,
  "description": "SmartAsset test",
  "script": "WzpuEpU"
}

そのレスポンスを /transactions/broadcast へ投げればOK

  • script にはbase58エンコードされたRIDEスマートコントラクト
    (signのレスポンスではデコードされたテキストになっている。broadcastする際にはbase58エンコードデータに設定し直すこと)
  • それ以外は従来のトークン発行トランザクションと同じ
  • versionは2にすること

signレスポンスでscriptがデコードされているのはバグかな?

使ったスクリプトについて

上記例のスマートコントラクトは 

false

のみのもの。
何もできなくなるスマートコントラクト。
正しく設定できたなら、例えばトークン送信しようとするとTransactionNotAllowedByScriptみたいなエラーが得られる

extraFee

SmartAccounts, SmartAssetのトランザクションには追加の手数料が発生する。
具体的には、スマートコントラクトの結果がTureとなりトランザクション発行が許可された時、
そのトランザクション発行のためには、トランザクションのもともとの手数料(例えばTransferなら0.001WAVES)に現時点では0.004WAVES(extraFee)を加えた手数料が必要になる。

その他

まだ分からないこと多いですが、
最初に述べたように正確な情報は公式待ち。

メインネットリリースまで時間あるし触っていきますかね。

  • 2018-05-05 色々試してみた。(リンク)

See also