この一連の記事では、Golang での単純なブロックチェーン実装に基づく単純化された暗号通貨を 5 分以内に構築します。このプロジェクトを作成するには、まず golang をインストールする必要があります。テキスト エディターには何でも使用できますが、ここでは Visual Studio コードを使用します。
インストールしましたか?よし、やってみよう!
プロジェクトを作成した場合はファイルを作成します main.go 。それではコーディングしましょう。まず main.go から始めます。「blockchain」の struct Block 部分から始めましょう。ブロックチェーンでは、貴重な情報を保存するブロックです。たとえば、ビットコイン ブロックには、あらゆる暗号通貨の本質であるトランザクションが保存されます。これに加えて、ブロックには、バージョン、現在のタイムスタンプ、前のブロックのハッシュなどの技術情報が含まれています。この記事では、ブロックチェーンまたはビットコインの仕様に記載されているとおりにブロックを実装するのではなく、重要な情報のみを含む簡易バージョンを使用します。外観は次のとおりです。ここに構造体ブロックがあります。
type ブロック構造体 {タイムスタンプ time.Timeトランザクション []文字列前のハッシュ []バイトハッシュ[]バイト}
Timestamp
現在のタイムスタンプ (ブロックが作成されたとき)、 transactions
ブロックに含まれる実際の貴重な情報です。 prevhas
前のブロックのハッシュを保存し、 Hash
ブロックのハッシュです。ビットコインの仕様では Timestamp
, prevhash
, Hash
は、別のデータ構造を形成するブロック ヘッダーとトランザクション (transaction
私たちの場合) は別のデータ構造です。したがって、簡単にするためにここではそれらを混合しています。
では、ハッシュはどうやって計算するのでしょうか?ハッシュの計算方法はブロックチェーンの非常に重要な機能であり、この機能によってブロックチェーンが安全になります。問題は、ハッシュの計算は計算的に困難な操作であり、高速なコンピューターであっても時間がかかるということです (だからこそ、人々はビットコインをマイニングするために強力な GPU を購入するのです)。これは意図的なアーキテクチャ設計であり、新しいブロックの追加を困難にし、追加後のブロックの変更を防ぎます。このメカニズムについては、今後の記事で説明して実装します。
現時点では、ブロック フィールドを取得して連結し、連結された組み合わせに対して SHA-256 ハッシュを計算するだけです。これをやってみましょう Newhash
方法:
func NewHash(time time.Time, トランザクション []string, prevhash []byte) []byte {input := append(prevhash, time.String()...)トランザクションの場合 := 範囲トランザクション {input = append(入力, 文字列(ルーン(トランザクション))...)}ハッシュ := sha256.Sum256(入力)ハッシュを返す[:]}
次に、Golang の規則に従って、ブロックの作成を簡素化する関数を実装して終了します。
func Blocks(transactions []string, prevhash []byte) *Block {currentTime := time.Now()ブロックして返す(&B){タイムスタンプ: time.Time{}、トランザクション: トランザクション、前ハッシュ: 前ハッシュ、ハッシュ: NewHash(currentTime、トランザクション、prevhash)、}}
引き続き print 関数を作成します。 print 関数は、トランザクションを実行する各ブロックの内容を印刷するのに役立ちます。コードは次のとおりです:
func Print(block *Block) {fmt.Printf("ttime: %sn", block.timestamp.String())fmt.Printf("tprevhash: %xn", block.prevhash)fmt.Printf("thash: %xn", block.Hash)}
そして印刷トランザクションの関数トランザクション:
func トランザクション(ブロック *ブロック) {fmt.Println("tTransactions:")for i、transaction := range block.transactions {fmt.Printf("tt%v: %qn", i, トランザクション)}}
必要な関数がすべて完了したら、それを main 関数で使用します。
func main(){ライアン := []string{"ライアンディはレザに 50 BTC を送金しました"}block_1 := ブロック(ライアン, []バイト{})fmt.Println("これが最初のブロックです")印刷(ブロック_1)トランザクション(ブロック_1)ジャック := []string{"ジャックはレイノルドに 20 BTC を送る"}block_2 := ブロック(jack, block_1.Hash)fmt.Println("これは 2 番目のブロックです")印刷(ブロック_2)トランザクション(ブロック_2)}
これでコードはすべて書き終わりました。ターミナルで go run main.go と入力して実行してみましょう。出力:
まとめ
私たちは非常に単純なブロックチェーン プロトタイプを構築しました。これは単なるブロックの配列であり、各ブロックは前のブロックとの接続を持っています。ただし、実際のブロックチェーンはさらに複雑です。私たちのブロックチェーンでは、新しいブロックの追加は簡単かつ迅速ですが、実際のブロックチェーンでは、新しいブロックの追加にはいくつかの作業が必要です。ブロックを追加する許可を得る前に、いくつかの重い計算を実行する必要があります (このメカニズムは Proof-of-Work と呼ばれます)。また、ブロックチェーンは単一の意思決定者が存在しない分散型データベースです。したがって、新しいブロックはネットワークの他の参加者によって確認および承認される必要があります (このメカニズムはコンセンサスと呼ばれます)。そして、私たちのブロックチェーンにはまだトランザクションがありません。