一文搞懂什么是区块链?

43 阅读3分钟

什么是区块链

区块链,顾名思义,就是由区块连接而成的链。其本质是一个去中心化的分布式账本技术,用来记录网络上发生的所有交易。

区块链特点

去中心化: 区块链系统是去中心化的,所有节点都参与数据的记录。

不可篡改: 一旦进入区块链,任何信息都无法更改。

无第三方: 基于区块链的交易,不需要双方的信任,因为数据库和交易过程都是公开的,节点之间无法互相欺骗,同时还可以用智能合约来保证交易的执行。

集体维护: 系统需要集体的共同维护,所有具有维护功能的节点都参与系统维护的工作。

区块链结构与算法

区块

Block,每个区块记录着上一个区块的hash值、本区块中的交易集合、本区块的hash等基础数据,由于每个区块都有上一区块的hash值,区块间由这个值两两串联,形成了区块链。

区块结构体定义:

type Block struct {
    //1.区块高度 编号
    Height int64
    //2.上一区块hash
    PrevHash []byte
    //3.交易数据
    Transactions []*Transaction
    //4.时间戳
    TimeStamp int64
    //5.Hash
    Hash []byte
    //6.随机数
    Nonce int64
}

区块链

BlockChain,通过区块上的hash值两两串联,就形成了区块链。

共识算法

为了保证数据的一致性和可信度,区块链采用共识算法来确保网络中所有节点对于新添加到账本中的交易达成共识。最常见的共识算法之一是工作量证明(Proof of Work),它要求矿工进行计算工作以获得新区块创建权。

type ProofOfWork struct {
    Block  *Block   //当前要验证的区块
    target *big.Int //难度 大数存储
}

//NewProofOfWork 创建新的工作量证明对象
func NewProofOfWork(block *Block) *ProofOfWork {

    //创建一个初始值为1的target
    target := big.NewInt(1)

    //左移 256 - targetBits
    target = target.Lsh(target, 256-targetBits)

    return &ProofOfWork{block, target}
}

//Run 工作量证明算法
func (pow *ProofOfWork) Run() (int64, []byte) {
    var hash [32]byte
    var hashInt big.Int

    nonce := 0
    for nonce < maxNonce {
        //将block的属性拼接成字节数组
        data := pow.prepareData(nonce)

        //生成hash
        hash = sha256.Sum256(data)
        fmt.Printf("\r%x", hash)
        hashInt.SetBytes(hash[:])

        //判断hash有效性,如果满足条件,跳出循环
        if hashInt.Cmp(pow.target) == -1 {
            break
        }
        nonce++
    }
    fmt.Print("\n\n")
    return int64(nonce), hash[:]
}

//Validate validates block's PoW
func (pow *ProofOfWork) Validate() bool {
    var hashInt big.Int

    data := pow.prepareData(int(pow.Block.Nonce))
    hash := sha256.Sum256(data)
    hashInt.SetBytes(hash[:])

    isValid := hashInt.Cmp(pow.target) == -1

    return isValid
}

//prepareData 将block的属性拼接成字节数组
func (pow *ProofOfWork) prepareData(nonce int) []byte {
    data := bytes.Join([][]byte{
        pow.Block.PrevHash,
        pow.Block.HashTransactions(),
        utils.IntToHex(pow.Block.TimeStamp),
        utils.IntToHex(int64(targetBits)),
        utils.IntToHex(int64(nonce)),
    }, []byte{})
    return data
}

Nance: 会一直试的计算次数 

寻找小于系统给定的目标值的Hash值,最后找到符合条件的Hash值和Nance,所以算力越强的电脑,更容易拿到记账权,从而增加区块,拉长链条。

区块链分类

区块链分为公有链、联盟链、私有链三种基本类型,其中:

  • 公链:完全去中心化,人人都可以参与,就行比特币(挖矿相当于在记账)。主要采取工作量证明机制(POW)、权益证明机制(POS)、股份授权证明机制(DPOS)等方式。
  • 联盟链:部分去中心化,参与者是指定的,联盟链可以是几家公司共同拥有的链,也可能是几个国家共同承认的链,这是后续发展的趋势。
  • 私链:中心化,写入权限建在一个组织手里的区块链,仅对特定的团队、组织或者个人开放。

小结

通过这段时间对于区块链的学习,基本了解了什么是区块链,以及区块链是怎么来的,它有用到了哪些核心技术,在未来的应用情况等等。