区块链技术——框架&基本原型

Dear 丶 2022-09-15 12:47 339阅读 0赞

区块链技术框架&区块链基本原型

一、区块链技术框架

1.区块链的定义

一个分布式的共享账本和数据库。

2.区块链的特点

加密货币+智能合约。
使用去中心化的分布式网络,有很多个终端。
具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。

3.比特币和区块链的关系

区块链在2009年诞生,比特币是基于它的第一个系统,也就是说,区块链是比特币的底层技术。

4.区块链的核心技术

①分布式存储
②密码学技术:哈希算法、对称加密、非对称加密、数字签名
③智能合约:一个自动担保账户,例如,当特定的条件满足时,程序就会释放和转移资金;智能合约是编程在区块链上的汇编语言,代码的执行是自动的:要么成功执行,或者所有的状态变化都撤消
④共识机制:一个预设的规则来指导各方节点在数据处理上达成一致,最开始的是:所有参与的节点通过比拼计算能力来竞争记账权

二、区块链基本原型

5.调用的算法

sha256算法:对于任意长度(按bit计算)的消息,sha256都会产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。

6.go语言语法必要介绍
  1. //hello.go文件
  2. package main
  3. import "fmt"
  4. func main()
  5. {
  6. fmt.Println("Hello, World!")
  7. }

运行的命令:go run hello.go
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!

7.目录

bin:可执行文件目录
pkg:包目录
src:源码目录
目录

8.定义区块(block)结构体
  1. type Block struct
  2. {
  3. Timestamp int64 //时间戳:区块创建的时间
  4. Data []byte //区块包含的数据
  5. PrevBlockHash []byte //前一个区块的哈希值
  6. Hash []byte //区块自身的哈希值,用于校验区块数据有效
  7. }
9.自定义方法:创建一个区块
  1. // NewBlock 初始化,创建一个新区块
  2. func NewBlock(data string,prevBlockHash []byte) *Block
  3. {
  4. block :=&Block
  5. {
  6. Timestamp: time.Now().Unix(),
  7. Data: []byte(data),
  8. //前一个区块哈希值为空
  9. PrevBlockHash: prevBlockHash,Hash: []byte{
  10. }
  11. }
  12. //设置哈希值
  13. block.SetHash()
  14. return block
  15. }
10.自定义方法:设置哈希值
  1. // SetHash 设置哈希值
  2. func (b *Block) SetHash()
  3. {
  4. //把时间戳转成字节数组
  5. timestamp :=[]byte(strconv.FormatInt(b.Timestamp,10))
  6. //所有的字节连在一起
  7. headers :=bytes.Join([][]byte{
  8. b.PrevBlockHash,b.Data,timestamp},[]byte{
  9. })
  10. //做校验,sha256算法
  11. hash :=sha256.Sum256(headers)
  12. b.Hash=hash[:]
  13. }
11.定义区块链(blockchain)数组
  1. // Blockchain 数组
  2. type Blockchain struct
  3. {
  4. Blocks []*Block
  5. }
12.自定义方法:区块链中添加一个区块
  1. // AddBlock 加入新的block,传入data,而不是区块
  2. func (bc *Blockchain) AddBlock(data string)
  3. {
  4. prevBlock :=bc.Blocks[len(bc.Blocks)-1]
  5. //确保数据没有被伪造
  6. newBlock :=NewBlock(data,prevBlock.Hash)
  7. bc.Blocks =append(bc.Blocks,newBlock)
  8. }
13.自定义方法:创建第一个区块
  1. func NewGenesisBlock() *Block
  2. {
  3. return NewBlock( "Genesis Block",[]byte{
  4. })
  5. }
14.自定义方法:创建一个区块链
  1. func NewBlockchain() *Blockchain
  2. {
  3. return &Blockchain{
  4. Blocks: []*Block{
  5. NewGenesisBlock()}}
  6. }
15.main.go文件
  1. package main
  2. import
  3. (
  4. "../core"
  5. "fmt"
  6. )
  7. func main()
  8. {
  9. //初始化区块链,创建第一个区块
  10. bc :=core.NewBlockchain()
  11. bc.AddBlock("Send 1 BTC to Ivan")
  12. bc.AddBlock("Send 2 more BTC to Ivan")
  13. //遍历
  14. for _,block :=range bc.Blocks
  15. {
  16. //前一个区块的哈希值
  17. fmt.Printf( "Prev. hash: %x\n",block.PrevBlockHash)
  18. fmt.Printf( "Data: %s\n",block.Data)
  19. fmt.Printf( "Hash: %x\n",block.Hash)
  20. fmt.Println()
  21. }
  22. //fmt.Println("Hello, World!")
  23. }
16.block.go文件
  1. package core
  2. import
  3. (
  4. "bytes"
  5. "crypto/sha256"
  6. "strconv"
  7. "time"
  8. )
  9. type Block struct
  10. {
  11. Timestamp int64
  12. Data []byte
  13. PrevBlockHash []byte
  14. Hash []byte
  15. }
  16. func NewBlock(data string,prevBlockHash []byte) *Block
  17. {
  18. block :=&Block
  19. {
  20. Timestamp: time.Now().Unix(),
  21. Data: []byte(data),
  22. PrevBlockHash: prevBlockHash,Hash: []byte{
  23. }
  24. }
  25. block.SetHash()
  26. return block
  27. }
  28. func (b *Block) SetHash()
  29. {
  30. timestamp :=[]byte(strconv.FormatInt(b.Timestamp,10))
  31. headers :=bytes.Join([][]byte{
  32. b.PrevBlockHash,b.Data,timestamp},[]byte{
  33. })
  34. hash :=sha256.Sum256(headers)
  35. b.Hash=hash[:]
  36. }
  37. func NewGenesisBlock() *Block
  38. {
  39. return NewBlock( "Genesis Block",[]byte{
  40. })
  41. }
17.blockchain.go文件
  1. package core
  2. type Blockchain struct
  3. {
  4. Blocks []*Block
  5. }
  6. func (bc *Blockchain) AddBlock(data string)
  7. {
  8. prevBlock :=bc.Blocks[len(bc.Blocks)-1]
  9. newBlock :=NewBlock(data,prevBlock.Hash)
  10. bc.Blocks =append(bc.Blocks,newBlock)
  11. }
  12. func NewBlockchain() *Blockchain
  13. {
  14. return &Blockchain{
  15. Blocks: []*Block{
  16. NewGenesisBlock()}}
  17. }
18.运行结果展示

打开终端(如图or在左下角找到终端or利用快捷键Alt+F12)
在这里插入图片描述
利用命令执行main.go文件
在这里插入图片描述

19.运行结果解释:

首先创建了一个区块链:
里面有三个区块:

  1. Prev. hash:
    Data: Genesis Block
    Hash: 4b8a18fbf804e8120bde13bca2f3789ba39c016baf3d7bce770d4b271c952b8e
  2. Prev. hash: 4b8a18fbf804e8120bde13bca2f3789ba39c016baf3d7bce770d4b271c952b8e
    Data: Send 1 BTC to Ivan
    Hash: 4f1364f0a2291bf5bc6492af47aa1ead56b655e81857691565a8d0196e0439fc
  3. Prev. hash: 4f1364f0a2291bf5bc6492af47aa1ead56b655e81857691565a8d0196e0439fc
    Data: Send 2 more BTC to Ivan
    Hash: 2e8e6b0888a471a942365c51c2c68d8c247d097bad22e69edd6751163a25ff98
20.总结:
  1. 区块按照插入的顺序进行存储。
  2. 可以通过哈希高效地检索一个块。
  3. 区块链中存储有效信息的是区块;而区块中存储的实际有效信息是data

发表评论

表情:
评论列表 (有 0 条评论,339人围观)

还没有评论,来说两句吧...

相关阅读

    相关 区块-技术简介

    1.什么是区块链? 区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组

    相关 区块核心技术

    区块链核心技术     区块链没有用到新的技术,也不是一个单项的技术,而是一个集成了多方面研究成果基础之上的综合性技术。普遍认为有三项必不可缺的核心技术,分别是:共

    相关 区块技术原理

     区块链是什么?     “区块链”技术最初是由一位化名中本聪的人为比特币(一种数字货币)而设计出的一种特殊的数据库技术,它基于密码学中的椭圆曲线数字签名算法(ECDSA

    相关 区块技术

    区块链技术 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。 特征: 一个区块加入了

    相关 区块基本技术原理

    今天我还是给大家讲一下区块链的基本原理。我知道很多搞技术的朋友都觉得区块链技术可能不是很难,但实际落地却不多,而且有些人说区块链概念太热了,实际上我觉得是因为他们还没有真正理解