区块链如何让“数据存储”变得不同?

区块链是什么呢,本质上讲,区块链是一种分布式、去中心化的网络数据库系统,这个系统会让数据的存储、更新、维护、操作变得不同。我们今天要讲的区块链呢,它有四项不可缺的核心技术,分别是:分布式存储、共识机制、密码学原理、智能合约。那么我们今天就讲一讲,与传统数据处理相比,区块链到底有什么不同,帮助大家了解区块链是什么,让大家对区块链有一个总的认知。区块链中的数据存储:块链式数据结构在数据存储方面,区块链技术利用的是“块链式数据结构”来验证与存储数据的。块链式结构是什么意思呢?铁链子大家都见过吧,一环套一环那种,那其实,每一环我们可以看作是一个区块,很多环节扣在一起就形成了区块链。区块里存储的是数据,和普通存储数据的不同之处在于:在区块链上,后一个区块里的数据是包含前一个区块里的数据的。(图片来源:Pixabay)以读书为例:我们平时看书,看完第一页,接着读第二页、第三页,……那在区块链里面呢,如果给每个区块标注上页码,那么第二页的内容是包含第一页的内容的,第三页的内容包含第一页和第二页的内容……第十页包含了前九页的内容,就是这样一个层层嵌套的链条,这样一来,就可以追溯到最本源的数据了,这就是区块链的可追溯性。

区块链系统的层次结构如下表格所示,现在我们开始学习最低层的数据层

区块链技术因为比特币的火爆而广受关注,我们这里用 python
代码来聊一下区块链技术:

序号 层级 含义
6 应用层 封装了区块链的各种应用场景和案例,可编程货币、可编程金融工具等
5 合约层 封装分类脚本、算法和智能合约,是区块链可编程特性的基础
4 激励层 主要出现在公链中,因为公有链中必须激励遵守规则参与记账的节点。
3 共识层 主要封装了网络节点的各类共识算法:PoW(工作量证明),PoS(权益证明),DPoS(股份授权证明)等.区块链的核心技术,决定由谁来记账.
2 网络层 分布式组网机制、数据传播机制和数据验证机制等。P2P组网技术。
1 数据层 封装了底层数据区块的链式结构,以及相关的非对称公私钥数据加密(RSA,ECC等),时间戳技术

区块链实现原理的简易描述 

先来看一下区块链的概念:
区块链是什么?一句话,它是一种特殊的分布式数据库,记载了所有的交易。而且是历史记录不能纂改的数据库。

区块链技术做为一种数字记账技术,其核心是将保存了交易数据的区块,以加密的方式,按时间的顺序链式记录。区块链本身就是一个公共的数据库,系统将新诞生的业务数据存储在被称为区块的容器之中,并将该区块添加到已有区块组成的链条之中。有点像贪吃蛇,吃的区块越多,蛇的身体越长;在比特币的应用场景下,这些数据是一组转账交易记录。在共享单车的应用场景下,这些数据就可以是借车还车的交易记录。

首先,区块链的主要作用是储存信息。任何需要保存的信息,都可以写入区块链,也可以从里面读取,所以它是数据库。
其次,任何人都可以架设服务器,加入区块链网络,成为一个节点。区块链的世界里面,没有中心节点,每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,因为所有节点最后都会同步,保证区块链一致。

区块链的简易实现代码

数据层

区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。
在区块链里,价值信息存储在区块之中。比如,比特币的区块存储交易记录,而交易记录是任何加密货币的核心。除此之外,区块里还包含有技术信息,比如它的版本号,当前的时间戳,以及上一个区块的哈希(Hash)。

图片 1

image.png

每个区块包含两个部分。

区块头(Head):记录当前区块的元信息
区块体(Body):实际数据

一个区块的简化数据结构

type Block struct {
  Timestamp   int64 //时间戳
  PrevBlockHash []byte  //上一个block的hash
  Hash      []byte  //这个区块的hash
  Data      []byte  //这个区块上记录的内容(交易信息)
}
  • Timestamp是当前的时间戳(即,区块被创建的时间),
  • PrevBlockHash 存储的是上一个区块的哈希,而Hash
    保存的是当前区块的哈希。
  • Data是区块中包含的价值信息,

在比特币的标配中,Timestamp、PrevBlockHash、Hash是区块的头部数据(Block
headers),构成一个单独的数据结构;
(Transactions,在我们这个版本中就是
Data),是另外一个单独的数据结构。而我们在这里为了简化,把数据结构混在了一起。

数据层封装了底层数据区块的链式结构,以及相关的非对称公私钥数据加密技术和时间戳等技术,这是整个区块链技术中最底层的数据结构,这些技术并不是什么新技术(区块链并没有什么深奥的),多数已经被发明了数十年了,并已经在计算机领域使用了很久,无须担心其中的安全性,因为如果这些技术出现安全性上的巨大漏洞的话,则意味着目前全球金融技术都有严重的问题。

中本聪(Satoshi
Nakamoto)在设计比特币(一个区块链系统)时,为每个区块设置了1MB大小的容量限制,最多只能包含2000多笔交易。但由于目前比特币的交易量迅速提升,1MB的区块空间能容纳的交易数量有限,所以目前出现了扩容区块的方案(
SegWit2x、BCH)。

图片 2

修改中。。。。。。。。。。。。。

一个极简的区块链原型

//Go语言源代码
package main

import (
    "bytes"
    "crypto/sha256"
    "fmt"
    "strconv"
    "time"
)
//区块的结构
type Block struct {
    Timestamp     int64
    Data          []byte
    PrevBlockHash []byte
    Hash          []byte
}

//区块链,一个有序的,反向链接的列表
type Blockchain struct {
    blocks []*Block
}
//计算区块的hash
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 NewBlock(data string, prevBlockHash []byte) *Block {
    block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
    block.SetHash()
    return 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 NewGenesisBlock() *Block {
    return NewBlock("Genesis Block", []byte{})
}
//创建一个已含有“创始块”的区块链
func NewBlockchain() *Blockchain {
    return &Blockchain{[]*Block{NewGenesisBlock()}}
}

func main() {
    bc := 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: %xn", block.PrevBlockHash)
        fmt.Printf("Data: %sn", block.Data)
        fmt.Printf("Hash: %xn", block.Hash)
        fmt.Println()
    }
}

编译执行结果
Prev. hash: 
Data: Genesis Block
Hash: 9d49827b7db8d2834c1661913c450f01ec61db71f2f424212b3678b1de4db4f7

Prev. hash: 9d49827b7db8d2834c1661913c450f01ec61db71f2f424212b3678b1de4db4f7
Data: Send 1 BTC to Ivan
Hash: 985b48402624d93e68c87af6dfffa5142ba0063284cdc1732035d6d0115d2822

Prev. hash: 985b48402624d93e68c87af6dfffa5142ba0063284cdc1732035d6d0115d2822
Data: Send 2 more BTC to Ivan
Hash: 1b8b59579a1f393788f9d7fa913d17c42b29c8a4430e40d65f4ebf5bf3f05b6c

参考:
区块链入门教程
别整天拿着“去中心化”说事儿了罢
区块链社会
Building Blockchain in Go. Part 1: Basic
Prototype
使用 Go
语言打造区块链(一)

在上述的代码中,区块链核心存储的数据结构是列表,通过
new_block()产生的新区块,被不断的增添到区块链的尾部,每个区块的 Hash
值中包含该区块所有的数据信息,在计算该 Hash 值的过程中需引用前一区块的
Hash
值,故而实现了防篡改。而区块链数据库的最大价值就是这种高度防篡改的可信计算。在我们的简易区块链实现中成功体现了这一点。在商用级的区块链应用中,新建区块的过程被称为智能合约,区块链就是通过智能合约不断的壮大。

以下是代码的运行结果,在不同的时间下,运行结果不同。

运行结果

图片 3

如想学习更多关于IT技术方面的文章,请前往51Testing软件测试网(

网站地图xml地图