一个分布式的共享账本和数据库。
加密货币+智能合约。
使用去中心化的分布式网络,有很多个终端。
具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。
区块链在2009年诞生,比特币是基于它的第一个系统,也就是说,区块链是比特币的底层技术。
①分布式存储
②密码学技术:哈希算法、对称加密、非对称加密、数字签名
③智能合约:一个自动担保账户,例如,当特定的条件满足时,程序就会释放和转移资金;智能合约是编程在区块链上的汇编语言,代码的执行是自动的:要么成功执行,或者所有的状态变化都撤消
④共识机制:一个预设的规则来指导各方节点在数据处理上达成一致,最开始的是:所有参与的节点通过比拼计算能力来竞争记账权
sha256算法:对于任意长度(按bit计算)的消息,sha256都会产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。
//hello.go文件
package main
import "fmt"
func main()
{
fmt.Println("Hello, World!")
}
运行的命令:go run hello.go
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
type Block struct
{
Timestamp int64 //时间戳:区块创建的时间
Data []byte //区块包含的数据
PrevBlockHash []byte //前一个区块的哈希值
Hash []byte //区块自身的哈希值,用于校验区块数据有效
}
// 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
}
// 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[:]
}
// Blockchain 数组
type Blockchain struct
{
Blocks []*Block
}
// 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)
}
func NewGenesisBlock() *Block
{
return NewBlock( "Genesis Block",[]byte{
})
}
func NewBlockchain() *Blockchain
{
return &Blockchain{
Blocks: []*Block{
NewGenesisBlock()}}
}
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!")
}
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{
})
}
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()}}
}
打开终端(如图or在左下角找到终端or利用快捷键Alt+F12)
利用命令执行main.go文件
首先创建了一个区块链:
里面有三个区块:
区块按照插入的顺序进行存储。
可以通过哈希高效地检索一个块。
区块链中存储有效信息的是区块;而区块中存储的实际有效信息是data。