知っている限りでは、イーサリアムのスマートコントラクトのトリガーとして考えられるのは
- 外部アカウントから発動するトランザクション
- スマートコントラクトのオーナーが直接にスマートコントラクトの関数を呼び出す
ぐらいしかない。
そうでしたら、よく言われている指定の日時になったら、残高を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のラムダを使って、指定日時にあるアドレスに送金するとか、指定日時にコントラクトのメソッドを呼び出すとか、の方法であればできると思いますが、スマートコントラクトだけ でできないことは、ちょっと意外でした。