LoginSignup
4
4

More than 5 years have passed since last update.

Ethereum(Geth)でwallet notify(のようなもの)を実現する

Posted at

gethにはbitcoindのようにwallet notifyが実装されていません。
その代わりに、WebsocketによるPub/Subでトランザクションを受信できる仕組みが用意されています。

RPC PUB SUB
https://github.com/ethereum/go-ethereum/wiki/RPC-PUB-SUB

gethにWeboscketで接続して、"newPendingTransactions"の購読メッセージを送信すると、
Pending状態のトランザクションがプッシュされてきます。

手順

1.起動時にWebsocketを有効にする

gethの起動時に、Websocketを有効にする為のオプションを指定する必要があります。
https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

例) geth --ws --wsaddr="127.0.0.1" --wsport "8546" --wsorigins "*"

2.Websocketサーバに接続してnewPendingTransactionsの購読メッセージを送信する

1でWebsocketを有効にしたら、そこに接続して以下のJson形式の購読メッセージを送信して、トランザクションの受信を開始します。

{
    "id": 1,
    "method": "eth_subscribe",
    "params": [
        "newPendingTransactions"
    ]
}

購読に成功すると、以下のメッセージが返ってきます。

{
    "jsonrpc": "2.0",
    "id": 2,
    "result": "0xc3b33aa549fb9a60e95d21862596617c"
}

resultのハッシュはパブリッシュされてきたメッセージを識別する為に使用するので、保持しておきます。

購読を開始すると、以下のJson形式のメッセージがパブリッシュされてきます。

{
    "jsonrpc": "2.0",
    "method": "eth_subscription",
    "params": {
        "subscription": "0xc3b33aa549fb9a60e95d21862596617c",
        "result": "0xd6fdc5cc41a9959e922f30cb772a9aef46f4daea279307bc5f7024edc4ccd7fa"
    }
}

メッセージ中のparamsのsubscriptionが、購読した時のレスポンスのresultフィールドと同じハッシュになります。
購読できるメッセージの種類はnewPendingTransactions以外にも幾つかありますが、パブリッシュされてきたメッセージの中には、
それがどのメッセージなのかを直接に表すフィールはありません。
なので、subscriptionのハッシュをチェックして、どのメッセージかを判定する必要があります。

paramsのresultが目当てのトランザクションのハッシュになります。このハッシュを引数にeth.getTransaction()を呼び出せば、トランザクションの詳細が取得できます。後は、トランザクションの詳細を元にアプリケーションの処理をすれば、walletnotifyと同等のことが実現できると思います。

注意しないといけない点としては、パブリッシュされてくるトランザクションのハッシュをフィルターする手段がないということです。
自ノード以外の管理していないアカウントのトランザクションもパブリッシュされてきます。
なのでそのトランザクションが自分が管理しているウォレットのアドレス宛のものなのかどうかを判定する為には、
全てのハッシュに対して、eth.getTransaction()をする必要があります。

Livenetで数十件/秒がパブリッシュされてきますので、データベース等に保存した方が良いと思います。
Json-RPCで短期間に大量にeth.getTransaction()を発行すると、RPCがエラーを返すことがあるので、
適切な負荷になるように調整する必要があると思います。

また、稀に同じトランザクションがパブリッシュされてくることがありますので、そこもケアする必要があります。

動作確認で使用したサンプルを貼り付けておきます。
https://gist.github.com/myaaaaa-chan/4c75f112c32bbee6bb410036dd839cb8

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4