区块链技术框架&区块链基本原型
一、区块链技术框架
1.区块链的定义
一个分布式的共享账本和数据库。
2.区块链的特点
加密货币+智能合约。 使用去中心化的分布式网络,有很多个终端。 具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。
3.比特币和区块链的关系
区块链在2009年诞生,比特币是基于它的第一个系统,也就是说,区块链是比特币的底层技术。
4.区块链的核心技术
①分布式存储 ②密码学技术:哈希算法、对称加密、非对称加密、数字签名 ③智能合约:一个自动担保账户,例如,当特定的条件满足时,程序就会释放和转移资金;智能合约是编程在区块链上的汇编语言,代码的执行是自动的:要么成功执行,或者所有的状态变化都撤消 ④共识机制:一个预设的规则来指导各方节点在数据处理上达成一致,最开始的是:所有参与的节点通过比拼计算能力来竞争记账权
二、区块链基本原型
5.调用的算法
sha256算法:对于任意长度(按bit计算)的消息,sha256都会产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。
6.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.自定义方法:创建一个区块
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.自定义方法:设置哈希值
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[:]
}
11.定义区块链(blockchain)数组
type Blockchain struct
{
Blocks []*Block
}
12.自定义方法:区块链中添加一个区块
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()
}
}
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。
|