區塊鏈技術框架&區塊鏈基本原型
一、區塊鏈技術框架
1.區塊鏈的定義
一個分布式的共享賬本和資料庫,
2.區塊鏈的特點
加密貨幣+智能合約,
使用去中心化的分布式網路,有很多個終端,
具有去中心化、不可篡改、全程留痕、可以追溯、集體維護、公開透明等特點,
3.位元幣和區塊鏈的關系
區塊鏈在2009年誕生,位元幣是基于它的第一個系統,也就是說,區塊鏈是位元幣的底層技術,
4.區塊鏈的核心技術
①分布式存盤
②密碼學技術:哈希演算法、對稱加密、非對稱加密、數字簽名
③智能合約:一個自動擔保賬戶,例如,當特定的條件滿足時,程式就會釋放和轉移資金;智能合約是編程在區塊鏈上的匯編語言,代碼的執行是自動的:要么成功執行,或者所有的狀態變化都撤消
④共識機制:一個預設的規則來指導各方節點在資料處理上達成一致,最開始的是:所有參與的節點通過比拼計算能力來競爭記賬權
二、區塊鏈基本原型
5.呼叫的演算法
sha256演算法:對于任意長度(按bit計算)的訊息,sha256都會產生一個32個位元組長度資料,稱作訊息摘要,當接收到訊息的時候,這個訊息摘要可以用來驗證資料是否發生改變,即驗證其完整性,
6.go語言語法必要介紹
//hello.go檔案
package main
import "fmt"
func main()
{
fmt.Println("Hello, World!")
}
運行的命令:go run hello.go
需要注意的是 ‘{ ’不能單獨放在一行,但是下面為了展示得更加清晰,所以做了處理!!!
需要注意的是 ‘{ ’不能單獨放在一行,但是下面為了展示得更加清晰,所以做了處理!!!
需要注意的是 ‘{ ’不能單獨放在一行,但是下面為了展示得更加清晰,所以做了處理!!!
7.目錄
bin:可執行檔案目錄
pkg:包目錄
src:原始碼目錄

8.定義區塊(block)結構體
type Block struct
{
Timestamp int64 //時間戳:區塊創建的時間
Data []byte //區塊包含的資料
PrevBlockHash []byte //前一個區塊的哈希值
Hash []byte //區塊自身的哈希值,用于校驗區塊資料有效
}
9.自定義方法:創建一個區塊
// NewBlock 初始化,創建一個新區塊
func NewBlock(data string,prevBlockHash []byte) *Block
{
block :=&Block
{
Timestamp: time.Now().Unix(),
Data: []byte(data),
//前一個區塊哈希值為空
PrevBlockHash: prevBlockHash,Hash: []byte{}
}
//設定哈希值
block.SetHash()
return block
}
10.自定義方法:設定哈希值
// SetHash 設定哈希值
func (b *Block) SetHash()
{
//把時間戳轉成位元組陣列
timestamp :=[]byte(strconv.FormatInt(b.Timestamp,10))
//所有的位元組連在一起
headers :=bytes.Join([][]byte{b.PrevBlockHash,b.Data,timestamp},[]byte{})
//做校驗,sha256演算法
hash :=sha256.Sum256(headers)
b.Hash=hash[:]
}
11.定義區塊鏈(blockchain)陣列
// Blockchain 陣列
type Blockchain struct
{
Blocks []*Block
}
12.自定義方法:區塊鏈中添加一個區塊
// AddBlock 加入新的block,傳入data,而不是區塊
func (bc *Blockchain) AddBlock(data string)
{
prevBlock :=bc.Blocks[len(bc.Blocks)-1]
//確保資料沒有被偽造
newBlock :=NewBlock(data,prevBlock.Hash)
bc.Blocks =append(bc.Blocks,newBlock)
}
13.自定義方法:創建第一個區塊
func NewGenesisBlock() *Block
{
return NewBlock( "Genesis Block",[]byte{})
}
14.自定義方法:創建一個區塊鏈
func NewBlockchain() *Blockchain
{
return &Blockchain{Blocks: []*Block{NewGenesisBlock()}}
}
15.main.go檔案
package main
import
(
"../core"
"fmt"
)
func main()
{
//初始化區塊鏈,創建第一個區塊
bc :=core.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()
}
//fmt.Println("Hello, World!")
}
16.block.go檔案
package core
import
(
"bytes"
"crypto/sha256"
"strconv"
"time"
)
type Block struct
{
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
}
func NewBlock(data string,prevBlockHash []byte) *Block
{
block :=&Block
{
Timestamp: time.Now().Unix(),
Data: []byte(data),
PrevBlockHash: prevBlockHash,Hash: []byte{}
}
block.SetHash()
return block
}
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 NewGenesisBlock() *Block
{
return NewBlock( "Genesis Block",[]byte{})
}
17.blockchain.go檔案
package core
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)
}
func NewBlockchain() *Blockchain
{
return &Blockchain{Blocks: []*Block{NewGenesisBlock()}}
}
18.運行結果展示
打開終端(如圖or在左下角找到終端or利用快捷鍵Alt+F12)

利用命令執行main.go檔案

19.運行結果解釋:
首先創建了一個區塊鏈:
里面有三個區塊:
- Prev. hash:
Data: Genesis Block
Hash: 4b8a18fbf804e8120bde13bca2f3789ba39c016baf3d7bce770d4b271c952b8e - Prev. hash: 4b8a18fbf804e8120bde13bca2f3789ba39c016baf3d7bce770d4b271c952b8e
Data: Send 1 BTC to Ivan
Hash: 4f1364f0a2291bf5bc6492af47aa1ead56b655e81857691565a8d0196e0439fc - Prev. hash: 4f1364f0a2291bf5bc6492af47aa1ead56b655e81857691565a8d0196e0439fc
Data: Send 2 more BTC to Ivan
Hash: 2e8e6b0888a471a942365c51c2c68d8c247d097bad22e69edd6751163a25ff98
20.總結:
區塊按照插入的順序進行存盤,
可以通過哈希高效地檢索一個塊,
區塊鏈中存盤有效資訊的是區塊;而區塊中存盤的實際有效資訊是data,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313176.html
標籤:區塊鏈
上一篇:區塊鏈技術——作業量證明
