iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1
Blockchain

Go to Blockchain: 從區塊鏈基礎到用 Go 實作區塊鏈系列 第 11

Go to Blockchain: Day11 開始自幹區塊鏈-完成基本區塊鏈

  • 分享至 

  • xImage
  •  

既然前面已經把區塊的基本架構寫好惹,我們就來把它串成鏈吧~

區塊鏈 structure

  • 這次是要創建一個 Blockchain 的 structure,由於區塊鏈是一個鏈狀的結構,我們可以直接用一串前面定義的 Block 把它們串起來~
type Blockchain struct {
	Blocks []*Block
}
  • 接下來就把區塊接到區塊鏈上
    • 當有 data 進來時,我們要加一個區塊在區塊鏈的最後面,因此我們要先創一個新的區塊,然後在把它接上去
    • 還記得我們先前寫的 CreateBlock(data, prevblockhash) 嗎 ??
    • 現在我們就要拿它來創建區塊了,但是在創建之前,我們必須先知道前一個區塊的 Hash 才行
    • 因此程式碼如下:
func (blockchain *Blockchain) AddBlock(Data [] byte) {
	PrevBlock := blockchain.Blocks[len(blockchain.Blocks) - 1] // 取出前一個 Block
	NewBlock := CreateBlock(Data, PrevBlock.Hash) // 創建 Block
	blockchain.Blocks = append(blockchain.Blocks, NewBlock) // 把新創建的 Block 接上去
}
  • 在繼續創建一整條的區塊鏈之前,我們需要先把創建創始區塊
    • 把他跟前面的 block 的檔案放在一起
func CreateGenesisBlock() *Block {
	return CreateBlock([]byte("Genesis Block"), []byte{})
}
  • 最後就是創建區塊鏈了~
func CreateBlockchain() *Blockchain {
	return &Blockchain{[] *Block{CreateGenesisBlock()}}
}

讓區塊鏈跑起來xD

  • 我做的是一個能夠新增區塊、查詢區塊的檔案

  • 以下是我的 main.go

package main

import (
	"fmt"
	"bufio"
	"os"
	bc "mypackage/blockchain"
)

func Help() {
	fmt.Println("There are 3 operations:")
	fmt.Println("Type 1 for adding a new Block")
	fmt.Println("Type 2 for printing the Blockchain")
	fmt.Println("Type 3 for exiting")
}

func main() {
	fmt.Println("Welcome to our Blockchain project.")
	fmt.Println("Enter h for help")

	var (
		op string
	)

	NewBlockchain := bc.CreateBlockchain() // 新增一個區塊鏈
	for true {
		fmt.Scanln(&op)
		if op == "h" {
			fmt.Println("Printing the help")
			Help() // 顯示使用方法
		} else if op == "1" {
			fmt.Println("Entering your data:")
			reader := bufio.NewReader(os.Stdin)
			data, _, _:= reader.ReadLine() // 讀一整行 input
			NewBlockchain.AddBlock(data) // 利用 input 作為 data 來創建區塊鏈
		} else if op == "2"{
				for _ , block := range NewBlockchain.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()
				} // 查詢資料
		} else if op == "3"{
				break
		} else {
			fmt.Println("Please Enter h, 1, 2, 3")
		}
	}

}
  • 附上結果w
    https://ithelp.ithome.com.tw/upload/images/20190927/20120131y1txQMvVhN.png

上一篇
Go to Blockchain: Day10 開始自幹區塊鏈-架設區塊
下一篇
Go to Blockchain: Day 12 開始自幹區塊鏈-工作量證明(1)
系列文
Go to Blockchain: 從區塊鏈基礎到用 Go 實作區塊鏈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Sun10612137
iT邦新手 5 級 ‧ 2019-11-19 15:50:28

請問一下,bc "mypackage/blockchain"是什麼?
是一個可以下載的封包嗎?還是....
因為我使用vscode寫入時,vscode讀不出來

0
blu3cat3803
iT邦新手 5 級 ‧ 2019-11-25 18:02:34

很抱歉有點晚才回覆你~
這是 golang import 比較不同的地方
在 python 中 import 只要是同資料夾就可以直接 import
但是在 golang 中會以你的 GOPATH. 底下的 src 當起始路徑
換句話說,你要把檔案搬到你的 GOPATH/src 再 import 它
至於 import bc 'mypackage/blockchain' 其實就等同於 python 的 import ... as bc
詳細可以參考 : https://openhome.cc/Gossip/Go/Package.html

1
akce25874
iT邦新手 5 級 ‧ 2021-08-27 17:29:43

不好意思打擾了~
想詢問一下上鏈的部分,是利用哪一種鏈,公有、私有還是聯盟
因為第一次學所以比較不懂不好意思

這裡都是公有鏈喔~因為任何人都可以知道鏈上的資訊

我要留言

立即登入留言