Byteball開発者向け情報wiki - スマートコントラクトの仕様と実装
このページではスマートコントラクトで出来る事や、実装に必要な情報を列挙する予定です。
現在調査中。調査時のメモなども混ざっています。

以下メモ。
思いついたままに書いただけなのでまだ間違いなどが含まれている可能性大です。

大まかにスマートコントラクトとはなんなのか?

Byteballに置けるスマートコントラクトとは、
「オラクルを使って人毎にロック解除の制御ができる特殊なウォレット」
です。
特殊なウォレットに入金したあと、オラクル(DAGに書き込まれたデータ)をトリガーにして誰がどの様な条件でロック解除できるかを制御できます。
オラクルとして利用する条件設定は自由で、単純な時間の経過から、サイコロの様なただの乱数、飛行機が遅延したかどうか、スポーツの試合の結果まで幅広く設定できます。
また、複数の条件を組み合わせて複雑な制御を行うことも可能ですが設定した条件のいずれかを満たさない限り誰にもロック解除できないので注意が必要です。

スマートコントラクトの流れ

スマートコントラクトを提供している(チャット)ボットに接続

ボット側はユーザーのウォレットアドレスがわからないので確認を促す

ユーザーは自分のウォレットアドレスをボットに教える

ボットはもらったウォレットアドレスをもとにスマートコントラクトを作成。
支払いが必要ならユーザーに支払い請求のメッセージを送る

ユーザーの支払いが終わったら、
スマートコントラクトで定義された契約が完結されるまで金額は保持される

スマートコントラクトの制約

・ボットがスマートコントラクトを発行するには、関係する相手のウォレットアドレスを知っている必要がある。
・受け取り条件に関与するユーザーであってもスマートコントラクト側に接続する必要はないと思われる。
・支払いを求めるメッセージ送信は一度に一人まで?
・スマートコントラクトに複数のユーザーに入金を募る場合は、スマートコントラクトのウォレットのアドレスを教えて入金してもらう様にお願いするのが簡単と思われます。

スマートコントラクトの基本構造

スマートコントラクトは以下の2つの要素で成り立っています。

1:オラクルを使った条件定義

これはとても単純で、オラクルを使って「対象の航空機の発着時刻が遅れたかどうか」などの条件を管理している部分を指します。

2:1を用いたスマートコントラクト用ウォレットのロック制御

スマートコントラクトで契約を履行する際、まず誰かしらがスマートコントラクトが用意した専用ウォレットに金額を送付します。
このウォレットは設定した条件のどれかを満たさない限り誰にも開けられないようになっており、
例えば
「対象の航空機の発着時刻が遅れた」場合はユーザーがロックを解除して自分のウォレットに送金できる。
「対象の航空機の発着時刻が遅れなかった」場合はコントラクト提供側がロックを解除して自分のウォレットに送金できる。
「1ヶ月経過した」場合はユーザーがロックを解除して自分のウォレットに送金できる。
と言った感じの制御を行っています。

スマートコントラクトのオラクル参照の仕様

スマートコントラクトを使って契約を結んだ後、
(おそらく)ウォレットからスマートコントラクトにアクセスして出金するタイミングで
オラクルに格納された値を参照して解錠条件を満たしているかどうかを確認する。

オラクルは同じフィード名のデータをいくつも持つことが出来るため
複数データが存在する場合、時系列によってどのように変化するのか以下の図のようになっています。
フィードの値に1が入っていれば解錠条件を満たしたものとします。
また空白はdata_feedのデータがないものとします。
<過去スマコン作成未来>結果
パターン11取り出せない
パターン210取り出せない
パターン3101取り出せる
パターン31010取り出せる

上記の結果から、byteballのスマートコントラクトの解錠条件は以下の通りと考えられます。
  • スマートコントラクト作成以前のdata_feedは参照しない
  • スマートコントラクト作成後に作成されたdata_feedは全て参照し、その中で条件を満たすデータが存在する場合、スマートコントラクトは解錠される

例えばサイコロの目などランダムな値が繰り返し使われる場合、
スマートコントラクト作成者側は、時間毎に異なるdata_feedを作成してサイコロの値を記録していく必要があります。
同じdata_feed名で管理をしてしまうと、
スマートコントラクト作成後に長時間(data_feedに何度も値が書き込まれるまで)待つ事でいつかは自分が解錠出来る条件満たすことが出来てしまうため
スマートコントラクトとしては不適格です。

エラーメッセージとその意味

Error message原因・対策など
could not send payment: bad signature at path rlook under the table
could not send payment: precommit callback failedsmart wallet containing committed funds that only the counter-party can now spend
could not send payment: authentifier verification failedスマートコントラクトの条件が満たされていないことが原因
could not send payment: known badif you try a bad send repeatedly
could not create payment proposal: No bytes to pay fees手数料を支払えないため、ウォレットにbytesを送れば解決します。
connect to light vendor failed [socket closed]firewall? turn off Tor? (light vendor = hub)
???incoming payment not confirmed yet, so wait another 5 minutes or so
[internal] connection closedネットワーク相違(メインネット用のウォレットでテストネット用コントラクトに繋いでるなど)。もしくは機能してないと思われるハブを変えてみる。
unable to verify the first certificate???
too many messages, try sending a smaller amount [of blackbytes]額を少なくしてみてください
on login “Uncaught exception: Error: message encrypted to unknown key, device"don't click ok; right click > "inspect" > delete the window in the html code ; restart
unable to find parents; failed to find compatible parents: no deep unitswitness error, such as (user) swapping out two at once
Syncing -- 24 private payments left (Android)try clearing out smart wallets; related to private assets?

オラクルについて、参考ページ

https://byteroll.com/oracle


こちらのページにスマートコントラクトの実装に役立ちそうな投稿があったので
コピーしておきます。
後ほど読んで必要なら翻訳予定
https://bitcointalk.org/index.php?topic=1617816.0

tonychの投稿



スマートコントラクト生成サンプル(作成中)