plotConverter公開に関して
7/22追記
chia公式Twitterの方でconverterの事について触れられました。どうやらRedditの方で話題になったようです。色々な方の確認の結果、どうやら内部データの方にも変換に要したbyte列が埋もれているようで、こちらの変換は正常に動作しないとのRedditの見解、そしてchia公式からは以下のようなツイートが見られました。
A gentle security reminder to be wary of downloading blockchain db files from 3rd parties to bootstrap your node, or other tools and shortcuts (like this mythical-but-impossible "plot converter"), as they can easily contain hidden things to compromise your wallets or system.
— Chia Project (@chia_project) 2021年7月21日
"like this mythical-but-impossible"という事で、impossibleと言われてしまいました。今回自分はこのツイートを受けてgithubの方を非公開に変えることにしました。自分の知識不足で申し訳ございません。今後また何かありましたらよろしくお願いします。
初めに
とうとう作成が完成してデバッグが完了しました。丸々数日このコードを書き続けていました。そこそこ辛かったです。
使用に関して
このプログラムが引き起こしたであろう如何なる問題に関しても当製作者は責任を負いません。また、chia公式から使用の中止を求められた際は非公開にする可能性があります。その点に注意して使用してください。また、このプログラムが生成したplotファイルがchiaに対してどのようなバグを引き起こすか未だに想定しきれていない点がありますので、いずれこの変換で生成されたportable plotを正常の方法で再生成する事をお勧めします。
使用するにおいてこの点に注意して使用して下さい。
ダウンロードリンク
GitHub - MicotoTisaki/plotConverter
こちらにソースコードを公開しました。使用方法に関してはreadme.mdに記載されています。一応この記事ではもう少し詳しく書こうと思います。
使用方法
この変換ソフトを使用すると変換前のOG plotは削除されます。もしOG plotをhpoolなどで使用している場合は気をつけてください。
このソフトを使用するにあたってpythom3.8以降とVisual C++ Runtimeのインストールが必要です。以下のサイトからダウンロード・インストールを行ってください。
python3.8
Download Python | Python.org
Visual C++ Runtime
The latest supported Visual C++ downloads
pythonにおいては3.8でテストを行いました。3.9での動作確認は行っていませんが多分動きます。
インストールが終了したらpythonにpathを通しておいてください。調べれば方法はいっぱい出てきます。環境変数を弄るやつです。
次にcmdを使って必要なパッケージをインストールします。
python -m pip install --upgrade pip python -m pip install blspy
blspyはchiaがリリースしている暗号化パッケージです。plotファイルを生成するにあたって使用しています。
インストールが出来たらgithubからソースコードをダウンロードかcloneをしてください。サイト上部にあるCodeのプルダウンからDownload Zipを押すのが早いです。
ダウンロードしたら解答してconvert.pyを何かエディターで開きます。メモ帳でも構いません。
11,12行目の編集を行います。
11:new_puzzle_key = 'aaa' 12:new_farmer_key = 'bbb'
こうなっているため、ここのaaaとbbbを普段madmaxなどで使用しているアドレスに変えます。クオーテーションマークは残しておいてください。new_puzzle_keyは-cで使用している文字列、new_farmer_keyは-fで使用している文字列です。編集したら上書き保存をします。
次に、このconvert.pyをコピーして変換したいplotファイルが存在するフォルダにコピーします。配置としては以下のような感じです。
D:¥
|-aaa.plot
|-bbb.plot
|-ccc.plot
|-convert.py
この際、convert.pyを置いたドライブは空き容量102GiB(109GB)以上を確保しておいてください。
一時的にplotファイルを複製した後変換前ファイルを消すという処理を行っているため、空き容量が確保できないと処理が中断してしまいます。基本的に殆どの人が容量限界までplotファイルをおいている状態だと思いますので、1つだけplotファイルを削除する感じです。自分の場合は4TBで36plot入るため、35plot入っている状態でコードを走らせました。
そうしたら、cmdを起動してcdでconvert.pyが存在するディレクトリまで移動してコードを走らせます。
D: python convert.py
今回はDドライブ内のplotファイルを変換する想定で書きましたがEドライブの場合は1行目をE:に変えてください。そうするとcmdが走り始めてそのドライブに存在するplotファイルを全て変換し始めます。変換時にOG plotではなくportable plotだと認識した場合は変換候補から外されてスキップされます。
変換されたplotファイルは/create/aaa.plotという感じでcreateフォルダの中に保存されていきます。
使用後に関して
plotファイルの名前は日時の部分が書かれていないファイルが生成されます。変換された物かどうか判別する際はこれを目印にしてください。また、chia公式クライアントがファイルを認識する所までは確認出来ましたが、pool側が容量を認識するか・通常通り当選処理がされるかどうかに関してはデバッグ時間の問題とpoolの不安定さの問題からデバッグが出来ていません。そのため、マシンスペックが余っている人は変換したファイルは消して通常の手順でplotファイルを再生成することをお勧めします。
変換に要するマシンスペック
この変換に関しては殆どCPUリソースとメモリリソースを使用しません。自分はマイニングをしているだけのathronと8GRAMで20min/plotの速度で変換が成功しました。なので、適当に転がっているPCでの変換が可能です。ただ、madmaxと併用して走らせるとメモリとCPU不足で処理が遅くなる可能性があるため、その点には注意してください。いくらメモリを食わないといっても、plotファイルのデータ領域のコピー処理で少なからずメモリを食います。
投げ銭用アドレス
XCH: xch1zzjdj9m984vv67cmjuntxd53hz2d884fsk964d50xc0svzjaavusqh5phm
ETH:0x8aA85e161285Fedd628D25d9aD6a02c2d965cDfB
ちょっとばかしでも投げ銭していただけると非常に作ったかいが出て今後の新しい支援ソフトの開発のモチベーションに変化します。
後書きという名の愚痴
今回のコードの作成において、丸数日pythonと睨めっこしてました。7割の時間はchia公式のgithubのソースコードの解読とchiaposというplotファイル生成に関するC++で記載されたコードの解読です。残り3割はpythonでの実装とchiaコードの書き換え、デバッグに要しました。普通に今回はキツくて自分にプログラミングを中学生の頃に教えてくれた同期に聞きました。彼は今CTFやネットワークセキュリティ関係の事をやっています。時々プログラミングで詰まった際は助けてもらっています。毎回本当に感謝しています。
最近はpythonも触っていますが、元々はJavaの畑の住人でした。c++に関しては中学の時から怖くて読んでもいませんでした。必要になった時にちょっと読む程度で、基本はjavaに全部書き換えて読んでました。ただ、今回はProofOfSpaceというplotファイル生成の根本を行なっているコードがc++で記載されていました。流石にこれを読まないとplotファイルの書き換えは行えないため、根性で読みました。本当に辛かったです。ちなみに、読んだあとは必要な場所を全部pythonに書き換えました。c++は書けないから仕方ないね。どうやらc++の書き手に言わせればJavaの方が気が狂っているというらしいですが、自分としたらJavaの方が頭が硬いだけで素直だと思います。Kotlinは流石にやりすぎ。あれはふにゃふにゃしてる。あとxmlは書けない。
今回久しぶりにバイナリエディタも使いました。というのもplotファイルは基本byte列から生成されています。そのためバイナリデータとして読みに行かないと中身が解読できません。
技術的な話と覚え書的な事
今回のプログラムの動作は基本的にplotファイルのheader情報の再生成と書き換えです。データ領域は書き換えていません。
header情報はb'Proof of Space Plot'+plot_id+k+format_len+format_id+memo_len+memoで実装されています。
plot_idは(puzzle_hash,plot_public_key)を結合してSHA256を通した文字列から出来ており、format_idはb'v1.0'という4byte文字列が入っています。最後のmemoには(puzzle_hash,farmer_public_key,sk)という3つの変数が直接結合して入っています。なので、plotファイルからまずmemo領域を取得、そこからfarmer_public_keyとskを取得、skはplot作成の時に毎回乱数から生成されるbyte列のため、生成した後に今回変換するplotファイルで生成されたskで上書き、この上書きしたskとpuzzle_hashとplot_public_keyからplot_idという文字列を再生成し、plot_idとplot_memoのバイト列を再生成します。
再生成したらheader領域に変換後に入るbyte列を生成し、新しいplotファイルに書き込んでいきます。書き込むと、byte数が188byteから172byteに変化するのでその分を全部ずらしてデータ領域を書き込みます。正確にはpool_public_keyがpuzzle_hashに変化するためmemo領域が16byte短くなります。元のplotの先頭188byteを切ることはpythonの処理上出来ないため、新規でファイルを生成していきます。データ領域は200000byteごとに読み込んで新しいファイルにコピーしていきます。メモリ量的に101GiBを全部バッファに入れることはできないので、コピーをしたらメモリを解放して次の200000byteを押し込みます。
header情報の再生成にはそんなに時間はかかりません。基本的に時間がかかっているのはデータ領域の書き込みです。
また、デバッグに関してですが、chiaクライアントでFarmingになる所は確認出来ました。ただ、SpacePoolのPlotSpaceの増加に関してはchiaのpooling Protocolの点から不安定なためしっかりと確認ができませんでした。ただ、2時間ほどはSpaceが変換ファイルを含めたサイズになっていたため正常に動作しているとは思います。当選するかどうかに関しては無限に時間がかかってしまうため本当に無理です。
データ領域を生成しているコードを読んだのですが、plot_idとskを使用して基本的には生成しているらしいです。ただ、これに関してはc++で書かれているので本当に読めなかったです。byte列の操作をしているっぽいので本当に読めません。skはplotファイル生成時に使用されていたものを使っているのですが、plot_idはpuzzle_hashを使用して再生成しているため、もしかしたらheader領域とデータ領域で相違点が生じてしまっている可能性があります。ただ、データ領域まで再生成すると普通にplotファイルを生成しているのと変わらないためそれなら普通に作ります。この点からいずれ変換したplotファイルは再生成してくださいと注意を書いています。自分は一度全部OG plotは変換をかけますが、順次再生成を行っています。というか、自分のコードがchiaレベルの高度なことに対応出来ている自信がないため。
最後に
何かプログラムに関して不具合などがありましたらこの記事のコメントかTwitter@micomico_tisakiに連絡ください。極力対応します。よっぽど大きいバグがない限りはコード側は変更する予定はありませんが、致命的な部分が存在した場合は書き換えか公開中止を行います。
ということで、今回はこの辺で。ではまた。