Goのブロックチェーン。 パート1:プロトタイプ

内容







  1. Goのブロックチェーン。 パート1:プロトタイプ
  2. Goのブロックチェーン。 パート2:作業証明
  3. Goのブロックチェーン。 パート3:読み取り専用メモリとコマンドラインインターフェイス
  4. Goのブロックチェーン。 パート4:トランザクション、パート1
  5. Goのブロックチェーン。 パート5:アドレス
  6. Goのブロックチェーン。 パート6:トランザクション、パート2
  7. Goのブロックチェーン。 パート7:ネットワーク


ブロックチェーンは21世紀で最も革新的なテクノロジーの1つですが、まだその潜在能力を十分に発揮していません。 本質的に、ブロックチェーンは単に分散データベースです。 何がユニークなのですか? このデータベースは完全に開かれており、各参加者が完全または部分的に保存しています。 新しいレコードは、データベースを保存するすべての人の同意を得てのみ作成されます。 これにより、暗号通貨やスマートコントラクトなどがあります。







この一連のレッスンでは、ブロックチェーンに基づいて、単純化された暗号通貨を作成します。 言語としてGoを使用します。







ブロックする



「ブロックチェーン」部分の「ブロック」から始めましょう。 ブロックチェーンでは、ブロックは有用な情報を保存します。 たとえば、ビットコインブロックでは、暗号通貨の本質であるトランザクションを保存します。 ブロックには、有用な情報に加えて、バージョン、タイムスタンプ形式の作成日、前のブロックのハッシュなどのサービス情報が含まれています。 この記事では、関連情報のみを含む単純化されたブロックを作成します。 これをgo構造として説明します。







type Block struct { Timestamp int64 Data []byte PrevBlockHash []byte Hash []byte }
      
      





Timestamp



はブロックが作成された時間、 Data



はブロックに含まれる有用な情報、 PrevBlockHash



は前のブロックのハッシュを保存し、最後にハッシュはブロックのハッシュを含みます。 ビットコイン仕様では、 Timestamp



PrevBlockHash



およびHash



はブロックヘッダーを形成し、トランザクション(この場合はData



)とは別の構造を形成します。 簡単にするためにそれらを混合しました。







ハッシュはどのように計算されますか? ハッシュの計算はブロックチェーンの重要なプロパティの1つであり、そのおかげで安全と見なされます。 これは、ハッシュ計算がかなり複雑な操作であるためです(これが、マイナーがビットコインをマイニングするために強力なビデオカードを購入した理由です)。 これは、チェーン全体が変更されないように特別に設計されました。







これについては次の記事で説明しますが、ブロックのすべてのフィールドを接続し、結果をSHA-256にキャッシュするだけです。







 func (b *Block) SetHash() { timestamp := []byte(strconv.FormatInt(b.Timestamp, 10)) headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{}) hash := sha256.Sum256(headers) b.Hash = hash[:] }
      
      





次に、ブロックの「コンストラクター」を作成します







 func NewBlock(data string, prevBlockHash []byte) *Block { block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}} block.SetHash() return block }
      
      





ブロックの準備ができました!







ブロックチェーン



それではブロックチェーンを書きましょう。 本質的に、ブロックチェーンは特定の構造のデータベースです:順序付けられたリンクリスト。 つまり、ブロックは挿入順に保存され、各ブロックは前のブロックに関連付けられます。 この構造により、チェーンの最後のブロックを取得し、そのハッシュによってブロックを効果的に取得できます。







Golangでは、この構造は配列(配列)とマップ(マップ)を使用して実装できます:配列にはハッシュの順序付きリストが含まれ(配列はGoで順序付けられます)、マップはhash -> block



ペアを格納します(マップは順序付けされません)。 しかし、プロトタイプでは、ハッシュを使用してブロックを取得する必要がないため、配列のみを使用します。







 type Blockchain struct { blocks []*Block }
      
      





これが最初のブロックチェーンです! こんなに簡単だとは思いませんでした:)







ブロックを追加する機能を追加します。







 func (bc *Blockchain) AddBlock(data string) { prevBlock := bc.blocks[len(bc.blocks)-1] newBlock := NewBlock(data, prevBlock.Hash) bc.blocks = append(bc.blocks, newBlock) }
      
      





最初のブロックを追加するには、既存のブロックが必要ですが、ブロックチェーンは空です! したがって、どのブロックチェーンにも、 genesis



ブロックと呼ばれるブロックが少なくとも1つ必要です。 このようなブロックを作成するメソッドを実装します。







 func NewGenesisBlock() *Block { return NewBlock("Genesis Block", []byte{}) }
      
      





そして、 genesis



ブロックでブロックチェーンを作成する関数を実装します。







 func NewBlockchain() *Blockchain { return &Blockchain{[]*Block{NewGenesisBlock()}} }
      
      





ブロックチェーンが正しく機能していることを確認しましょう







 func main() { bc := NewBlockchain() bc.AddBlock("Send 1 BTC to Ivan") bc.AddBlock("Send 2 more BTC to Ivan") for _, block := range bc.blocks { fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash) fmt.Printf("Data: %s\n", block.Data) fmt.Printf("Hash: %x\n", block.Hash) fmt.Println() } }
      
      





このコードは出力します







 Prev. hash: Data: Genesis Block Hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168 Prev. hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168 Data: Send 1 BTC to Ivan Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1 Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1 Data: Send 2 more BTC to Ivan Hash: 561237522bb7fcfbccbc6fe0e98bbbde7427ffe01c6fb223f7562288ca2295d1
      
      





プロトタイプが動作します!







おわりに



非常に単純なブロックチェーンプロトタイプを作成しました。ブロックの単純な配列で、それぞれが前のブロックチェーンに関連付けられています。 実際のブロックチェーンははるかに複雑です。 私たちのブロックチェーンは新しいブロックを非常に簡単かつ迅速に追加しますが、実際のブロックチェーンでは、新しいブロックを追加するにはいくつかの作業が必要です。 さらに、ブロックチェーンは、単一の意思決定センターを持たない分散ベースです。 したがって、新しいブロックは他のネットワーク参加者によって確認および承認される必要があります(このメカニズムは



と呼ばれます)。 まあ、実際には、トランザクション自体はまだありません。







今後の記事では、これらすべてのプロパティを検討します。







参照資料



記事のソースコード








All Articles