メインコンテンツまでスキップ

スマートコントラクトの定時実行

· 約4分

知っている限りでは、イーサリアムのスマートコントラクトのトリガーとして考えられるのは

  • 外部アカウントから発動するトランザクション
  • スマートコントラクトのオーナーが直接にスマートコントラクトの関数を呼び出す

ぐらいしかない。

そうでしたら、よく言われている指定の日時になったら、残高をAアカウントに送金する ようなことをどう実現できるかを考えてみます。

「2017/12/01 00:00にアドレスAに10 ETHを送信する」ことを課題とします。

論理的に考えてみる

  • 普通のシステム上でこうしたい時は、あるサーバーに何かしらの手段でタイマーを設定し、2017/12/01 00:00になると、アドレスAに 10 ETH送信するプログラムを実行する流れになる
  • ブロックチェーンの場合は、P2Pネットワークに参加している各ノードが任意のタイミングでネットワークに参加・退出できるので、どのノードに任せるかは全く特定できない
  • 特定できないのもよいので、1つではなく複数個たとえば100個のノードに任せるのはどうでしょう
    • まず100個のノードに任せようとしても、2017/12/01 00:00になった時その100個のノードがどれもネットワークにない可能性は、ゼロではない
    • また、現状の各クライアントアプリは、P2Pネットワークに参加しデータ同期することと、同期できたブロックチェーンのデータとやり取りするAPIを公開することしかやってない

なので、論理上はできないように思います。

スマートコントラクトで考えてみる

  • コントラクトXを作成しておく、コントラクトXの内容は
    • 「2017/12/01 00:00-01:00」の1分間の間、最初にコントラクトXのYメソッドを呼び出すアドレスに 0.5 ETH を送信する
    • Yメソッドが呼び出されたら、アドレスAに 10 ETH を送信する
  • コントラクトXのアドレスに 10.5 ETH送金しておく

のように料金を払う形であれば、「2017/12/01 00:00-01:00の間Yメソッドの呼び出す」約束を守ってくれる可能性が高くなりますが、と言っても、祈っているにすぎない

個人の結論

  • 現状は、分かってないだけかもしれませんが、イーサリアムのスマートコントラクトで 指定日時に、あるアドレスに送金する ようなことは、まだ実現できないようです。
  • もちろん、自分のサーバまたはAWSのラムダを使って、指定日時にあるアドレスに送金するとか、指定日時にコントラクトのメソッドを呼び出すとか、の方法であればできると思いますが、スマートコントラクトだけ でできないことは、ちょっと意外でした。

参考