Programming Bitcoin をRust で実装していく(Part 1)
Twitch のライブ配信でコーディングを行っている中で今遊んでいるのが
オライリーの 「プログラミング・ビットコイン――ゼロからビットコインをプログラムする方法」
ていう書籍のコードです. ここではPython を用いてコーディングされていますが,自分はRust 学習中のため書き換えながら勉強中です.
ちなみに自分はCSの学位も持ってないですし, 高等数学ナニソレオイシイノ?な人なので解釈まちがってるとかいろいろ気になることがあればお気軽にコメントしてくださればと思います.
また読み進めながら & 別言語で実装しなおしてるため進めていく中でコードの修正があった場合適宜記事を編集していきます.
書籍リンク(アフィじゃないよ:
オライリーから書籍紹介を引用↓
本書は、ひとつのビットコインライブラリに必要なすべての要素を実際にコーディングすることで、ビットコイン技術の理解を深めることを狙いとした技術学習書です。ゼロから順を追ってビットコインライブラリを作成していくことで、その内部構造を紐解き、ビットコインの動作を学ぶことができます。
本書で学び終える頃には、トランザクションの作成ができるようになるのはもちろん、必要なデータをピアから受け取り、ネットワーク経由でトランザクションを送信できるようになります。数学、パース、ネットワーク接続、ブロック検証をはじめ、それらを可能にするために必要なものすべてを網羅しています。
また書籍のコードはGithub に公開されています
Jupyter 環境まで用意されてるので結構手厚い
1. 有限体を実装する準備
- 1章から聞いたことない単語「有限体」という題材
- 正直,これがどのようにBlockChainに関わってくるのか全くわかってないし,この章では詳しくは語られません.
有限体とは
- 集合に含まれるa,b に対して a+b や a * b も集合内に存在している(閉じてる)
- a + 0 = a となるような0が存在する
- a * 1 = a となるような1が存在する
などなど(詳細は書籍で) とりあえずなんかやっても集合内に属してる値で示せるぽい.
そしてこの有限体を実装するに当たり結構重要な要素がモジュロ演算というもの.
モジュロ演算は名前だけ聞くと「うっ」となりますが,そこまで難しい概念ではなく
7 % 3 = 1
↑ の余りを求める演算と定義されているものです.ならったことありますよね.
このモジュロ演算, 書籍のコードだとPythonのため上記の式のように%を用いて記述することができます.
print(7%3) # 1
print(-27%13) # 12
また, モジュロ演算は負の値でも用いることができるらしく2行目のような結果が出力されます.
しかし, Rust だと%で実装すると2つ目の負の値に関しては違う結果が出力されます.
println!("{:?}", (7%3)); // 1
println!("{:?}", (-27%13)); // -1
詳しい説明は Wiki に載っていますが 正直何いってんだこいつは状態です.
とりあえず 恐ろしくかい摘むとPython, Ruby の % とC++ やRust の% では実装内容が異なり結果が変わってくるということだけ頭に入れておけば大丈夫(ほんとに?)
では, どう実装したらいいのか.
Rustにおいては簡単に modulo というライブラリを導入するもしくは
a - (n * int(a/n))
という式で自前実装するかになると思います(詳細はWikiで)
今回はすでにライブラリがあることと,Rust のTrait 機能を使うためmodulo ライブラリを使用した実装としていきます.
使用方法はCargo.tomlファイルの [dependencies] に
modulo = 'x.x.x' # x は適宜自身の環境に合うVersionを指定してください. 自分は0.1.2を使いました
と記載するかもしくはcargo-edit を用いていれば
cargo add modulo
で勝手にVersionも指定されたものが記載されます.
脱線しましたが, Rust におけるモジュロ演算は上記ライブラリで導入することができ,下記のように実装できます
use modulo::Mod;
fn main() {
assert_eq!(1, 7.modulo(3));
assert_eq!(12, (-27).modulo(13));
}
これを 使って次では有限体を実装していきます.