IOTA-Pythonライブラリでのアドレス生成から送金まで

こんにちは。Takeです。最近は重い腰を上げてやっとVPSでフルノードを立てました。フルノードを立てたら、まずやることと言ったら、自分のローカルマシンに入っているライトウォレットのホストノードを自分のフルノードに設定して幸せになることだと思います。しかし、この多幸感も時間の経過とともに薄れてきましたので、次は何をしようかと悩んでいたところ、思いついたのは「APIを触ろう!」ということでした。

ライブラリはいくつかあり、JavaScript, Python, Java, C#, Goなどがあります。リファレンスとなるライブラリはJavaScriptなのですが、これについてはABmushiさんが丁寧に解説してくださっておりまして、私の出番はありません。そこで、今回はPythonのライブラリを選び、遊んでみることにします。そしてその遊びの軌跡を皆さんとも共有しようと思った次第です。Pythonistaの皆さんにはこれを足がかりにして、Djangoなんかのフレームワークでサクッと役に立つアプリを作って頂きたいなぁなんて。

それでは早速いってみましょうか!

pip install pyota

ライブラリの名前の紹介が遅れましたが、Pyotaと言います。パイオタ。ぱいおた。響きがなんだか、いや何でもない。とりあえずpipでインストールしちゃってください。sudoしたい方はsudoしてください\(^o^)/

pip install pyota[ccurl]

後ろにくっついてる[ccurl]は拡張機能です。処理が早くなるそうです。

get_node_info : ノード情報ゲットだぜ!

「ポケモン、ゲットだぜ!」的なノリで、手始めにノードの情報をゲットしたい。そのためにはオブジェクトの初期化が必要らしく。さくっと自分のノードのIPアドレスまたはドメインを入力しましょう。特定のSeedについて知りたい場合はそのSeedの情報も合わせて放り込みましょう。

from  iota  import  Iota 

#ランダムなSeedを勝手に生成してくれます。つまり残高0のSeedを勝手にセットしてくれるということですな。
api = Iota ( 'http:// localhost:14265' )

#こっちはSeedを指定します。自分のSeedを入力してくださいな。
api = Iota ( 'http:// localhost:14265', 'YOUR9SEED9HERE' )

今回はお遊び用に作った10iotaが入ったSeedを使います。

オブジェクトの初期化が済んだところで、さっそくノード情報をゲットします。

>>> print(api.get_node_info())
{u'neighbors': 3,
 u'packetsQueueSize': 0,
 u'appName': u'IRI',
 u'jreAvailableProcessors': 4,
 u'appVersion': u'1.4.1.6',
 u'transactionsToRequest': 949,
 u'jreMaxMemory': 8388608000,
 u'latestSolidSubtangleMilestoneIndex': 328658,
 u'jreVersion': u'1.8.0_151',
 u'latestMilestone':TransactionHash('GILAMYF9QKULRHEWAKOAWSKKILDDKVROESFFEVGCBTUQFBVXSEGGIFDOHZBUMAHIFGOAFVKJARRFA9999'),
 u'time': 1516119891896,
 u'duration': 0,
 u'jreTotalMemory': 2988441600,
 u'jreFreeMemory': 990000648,
 u'latestSolidSubtangleMilestone':TransactionHash('GILAMYF9QKULRHEWAKOAWSKKILDDKVROESFFEVGCBTUQFBVXSEGGIFDOHZBUMAHIFGOAFVKJARRFA9999'),
 u'tips': 6195,
 u'latestMilestoneIndex': 328658}

いろいろと情報がでてきますが、特筆すべきものはlatestSolidSubtangleMilestoneIndexlatestMilestoneIndexです。この数値が同値でないと、送金などの各種コマンドが使えません。つまりこの値が同値にならないとライトウォレットにもこのノードを繋げられないということです。初めてノードを立てたときはこのget_node_info()を叩きまくり、同期を待ったものです。因みにPrometheusGrafanaを使ってWeb上でフルノードを監視できます。お手がるですのでそちらもお勧めです。詳細は下記の関連記事からどうぞ。

IOTAフルノードコピペセットアップガイド

2018.01.11

get_new_addresses : アドレスをゲットする

今度はアドレスゲットだぜ!

>>> print(api.get_new_addresses())
{u'addresses': [Address('QNPFCYONZWSYFLQ9BGKPVIFXHQWTKVKSYVNKZTEQCHXTEFTMJMLQBSSA9MJSOWANIHJNIDDGSJNSGPLZX')]}

できたてホヤホヤのアドレスです。あれ?このアドレス見覚えあるなぁ。そうだ、このSeedを使って、ライトウォレットで一度アドレス生成したんだった。あれ?ライトウォレットで生成したアドレスは90字だったよなぁ。あ、そうか、後ろの9字はチェックサムか。だから、ライブラリから払い出されるアドレスはチェックサムなしの81字なんですね。実は、このアドレスに違うSeedのアドレスから予め10iotaを送金してあります。

さてさて、今回は他のアドレスが必要ですね。
というわけで、パラメータを放り込んで、新しいアドレスを作りましょう。

>>> print(api.get_new_addresses(0, 2))
{u'addresses': 
[Address('QNPFCYONZWSYFLQ9BGKPVIFXHQWTKVKSYVNKZTEQCHXTEFTMJMLQBSSA9MJSOWANIHJNIDDGSJNSGPLZX'),
 Address('KKLSMWROKODPOEER9MIHPRVCKSONBUMQIEQLHQOE9ZXSLQUVIODYEINBBDLMUF9LELARJYXMEXPCVUHVC')]}

でました、ドーン!最初の0はindexです。その次は、count。さっきのindexから始めていくつのアドレスを生成するかを指定しました。

send_transfer : 送金をする

さて、さきほど作った新しいアドレスに送金をしてみましょうか!
つまり10iの入ったQNP…から新しいアドレスKKL…に10iを送ってみます。
リモートから送金を試みるのは少し難度があがるので、今回はひとまずローカルで。

新しいファイルを作って、それをコンソールで実行することにします。

from iota import *

api = Iota('http://localhost:14265', b'TAKE9SEED')

tx = [ ProposedTransaction(
    address = Address( b'KKLSMWROKODPOEER9MIHPRVCKSONBUMQIEQLHQOE9ZXSLQUVIODYEINBBDLMUF9LELARJYXMEXPCVUHVC' ), #送金先のアドレス
    message = TryteString.from_string( 'im a golden retriever lover' ), 
    tag = Tag( b'TAKE9TEST' ),
    value = 10 ), ] #送金額

depth = 5

print(api.send_transfer(depth, tx))

実行してから、しばらく待つとレスポンスが来ます。
ログを取り忘れました。ごめんなさい。

ちゃんと送金できたのか、確認してみましょう。
こちらのtangle explorerを使います。
アドレスKKL…を検索ボックスにいれてと。

でました!

トランザクションハッシュQDMECKZRMCAKHLOJHIVBNTLBMJKZVMALTRNQWSHPRMAYXMIQITY9CDLKVFLGQPBEXHOXFBQAZN9RA9999をクリックしてみます。

きちんと10iotaがこのアドレスに送金され、Comfiredになっているのがわかります。TagTAKE9TEST999999999999999999となっています。空白は9でパディングされているようですね。Signature/MessageのところでTrytesに入っているチェックをTextのほうに変えてみると、あらまあ、im a golden retriever loverと堂々たる主張がなされています(笑)因みに、このメッセージを暗号化できるようにする機能がMAMです。MAMについての公式からの発表の翻訳はこちら。ABmushiさんによるMAMの深堀り記事はこちらです。詳しく知りたい方はどうぞ!

MAMとは。IOTAのIoT性。

2017.12.30

Masked Authenticated Messagingの紹介

2017.11.12

ライトウォレットの方はどうなってるでしょうか。

ふむふむ。確かに反映されていますね。

終わりに代えて

ちょっと疲れたので、今回はここまでにします。本当はもっとたくさんご紹介したいことがあるのですが、記事にするのって気力が要るんですなぁ〜(笑)そして、Pyotaで詰まったときはABmushiさんに助けてもらいました。ありがとうございます!わからないことがあったら、Discordに参加して聞いてみると、詳しい方からお返事がもらえます。英語ができるのであれば#pythonチャンネルでライブラリの開発者に直接質問することができます。コア開発者の方はとても丁寧な方で、私みたいなPython初心者にも気さくに返事してくれますよ\(^o^)/

IOTAコミュニティへの参加方法(Discord)

2017.09.05

下記にリファレンスをご紹介しますので、いじってみたい!という方はどしどしやっていみてくださいな(^o^)

リファレンス

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です