1 区块链
简单地说,区块链其实就像是一个不可篡改的分布式数据库,该分布式数据库记录了一系列交易或事件。区块链运行在至少1个以上的节点上,每个节点都有自己的一个分布式数据库,也就是分布式账本。正常情况下,每个节点的分布式数据库里的数据都是一样的。区块链由不断生成的区块链接而成。一个区块包含区块头(Block Header)和区块数据(Block Data),区块数据又称为区块体(Block Body)。每个区块包含了一批交易的数据、时间戳和前一个区块的哈希值。哈希值是一种唯一标识,它保证了每个区块的完整性,一旦数据发生改变,哈希值也会立刻发生变化,因此保障了数据的安全性。而要改变一个区块,就要改变它之后所有的区块,这种特性使得区块链非常安全。此外,区块链是分布式的,因此没有单一的控制中心(除非区块链只运行在1个节点上),使得数据变得更加透明、可追溯和公开。总的来说,区块链是一种用于记录交易和事件数据的技术,它的特点是去中心化、不可篡改、透明、安全,并且可以实现智能合约等功能。
1.1 区块头
对于比特币来说,区块头(Block Header)包含以下几个字段:
- 版本号(Version):这是表示区块链协议的版本号。
- 前一个区块的哈希值(Previous Block Hash):这是前一个区块的哈希值,将前一个区块与当前区块链接起来,形成区块链。
- 默克尔根(Merkle Root):这是由所有交易数据构建的默克尔树的根哈希值,确保区块中的交易数据的完整性。
- 时间戳(Timestamp):这是区块的创建时间,以UNIX时间戳的形式表示。
- 难度目标(Difficulty Target):这是一个用于控制区块链的挖矿难度的参数,在计算哈希值时起到限制条件的作用。
- 随机数(Nonce):这是一个用于满足挖矿难度要求的随机数,矿工需要不断尝试不同的随机数来寻找满足要求的哈希值。
1.2 区块体
区块数据可以包含0笔、1笔或多笔交易,这些交易包括矿工的挖矿交易和其他转账交易。每笔交易信息都可以通过哈希函数,例如MD5、SHA-256,得到一个唯一对应的哈希值,也就是这笔交易的哈希值。对于比特币来说,使用SHA-256哈希函数。需要注意的是,每笔交易的信息,改变了哪怕1 bit的内容,交易的哈希值也就会被改变。哈希函数,简单地说,就是对于任意长度的输入,通过散列算法变换,都能得到一个成固定长度的输出,该输出就是散列值。
例如,如果使用MD5算法:
对于输入:"123456",它的MD5的输出就是:"E10ADC3949BA59ABBE56E057F20F883E",即: MD5("123456")="E10ADC3949BA59ABBE56E057F20F883E"
对于输入:"哈希函数,简单地说,就是对于任意长度的输入,通过散列算法变换,都能得到一个成固定长度的输出,该输出就是散列值。",它的MD5的输出就是:"1AC00B1CA622EF532564A51C29DA5D0D",
即: MD5("哈希函数,简单地说,就是对于任意长度的输入,通过散列算法变换,都能得到一个成固定长度的输出,该输出就是散列值。")="1AC00B1CA622EF532564A51C29DA5D0D"
关于哈希函数和交易id是如何来的,详细可以参考我的这篇文章:
以太坊的交易id是如何来的 - 知乎
默克尔根的计算过程:
假设,区块数据里包含有5笔交易A、B、C、D、E。这5笔交易通过哈希函数得到的交易哈希分别是H1、H2、H3、H4、H5,然后把这5个交易哈希再两两组合,再一次进行哈希运算。即把H1和H2组合起来进行哈希运算,得到H12;把H3和H4组合起来进行哈希运算,得到H34,H5不变。这时候,得到新的交易哈希集合:H12、H34、H5。然后再进行新一轮的组合哈希运算,得到新的交易哈希集合:H1234、H5。最后,进行最后一轮的组合哈希运算,得到新的交易哈希根值:H12345。整个过程形成了Merkle树(Merkle Tree),这棵树的根节点就是交易哈希根值:H12345,也就是默克尔根(Merkle Root),它是由所有交易数据构建的默克尔树的根哈希值。默克尔树是一种二叉树结构,用于对多个交易进行散列和汇总,确保区块中的交易数据的完整性。
1.3 区块的哈希值的计算过程
以下是涉及到计算比特币区块哈希值的一些关键步骤和数据:
- 区块头(Block Header):比特币的每个区块都有一个区块头,它是一个包含多个字段的数据结构。区块头中包含了一些重要的信息,包括版本号、前一个区块的哈希值、默克尔根、时间戳和难度目标等。
- Merkle树(Merkle Tree):在区块头中有一个字段叫做默克尔根(Merkle Root),它是由所有交易数据构建的默克尔树的根哈希值。默克尔树是一种二叉树结构,用于对多个交易进行散列和汇总,确保区块中的交易数据的完整性。
- 工作量证明(Proof-of-Work):比特币的区块链使用工作量证明机制来保护区块的安全性。为了计算区块哈希值,需要找到一个特殊的值,称为Nonce(随机数),使得通过对区块头的所有字段进行哈希运算后,得到的哈希值满足难度目标。这个过程是一个不断尝试的过程,需要大量的计算和能量消耗。
- 哈希函数(Hash Function):比特币使用SHA-256(Secure Hash Algorithm 256-bit)算法作为其哈希函数。SHA-256是一种加密哈希函数,它将输入数据转换为一个固定长度的哈希值,通常是256位。
根据上述数据和步骤,计算比特币区块的哈希值的过程如下:
- 将区块头的各个字段进行拼接,得到一个长的二进制数据。
- 使用SHA-256哈希函数对拼接后的二进制数据进行哈希运算,得到一个256位的哈希值。
- 如果得到的哈希值不符合难度目标,即不满足比特币网络中设定的困难程度,就需要不断尝试不同的Nonce值,再次进行哈希运算,直到找到满足要求的哈希值为止。
- 最终找到满足要求的哈希值后,将这个哈希值添加到区块头中的哈希字段,形成最终的区块头。
比特币的区块哈希值计算是一个耗时且困难的过程,需要大量的计算资源和能量。也就是说,比特币矿工挖矿的过程,就是不断地调整Nonce值进行哈希函数运算,使其计算出来的区块的哈希值满足难度目标,这样就获得了出块权产生该区块,从而获得区块奖励。更具体来说,就是比特币矿工计算出来的哈希值,等于或低于比特币网络设定的256位目标数字的有效哈希值的难度时,矿工就可以成功找到并解锁新区块。因此,该目标值越低,挖掘难度就越高,而且该目标值是动态调整的。比特币大约每10分钟产生一个区块,每挖出2016个块调整一次比特币挖矿难度调整。正常情况下,比特币每挖出2016个块,也就是需要每14天左右,所以,矿工也称14天为一个难度期。比特币挖矿难度调整是根据之前一个难度周期比特币挖矿难度调整的比特币全网算力来调整,所以难度和全网算力是相关的,时间上有一定的滞后。当矿工在一个难度期内发现区块挖掘时长低于10分钟这个目标平均值时,比特币网络将会增加难度;反之,就会降低难度。这样的做法,保证矿工挖掘新区块的时间尽可能地接近10分钟的平均值。
除了创世区块外,每一个区块都通过指向前一个区块的区块哈希值,和前一个区块关联起来,这样所有的区块就形成了一条内容难以被篡改的链,这就是区块链。因为一个区块的内容如果改变了,那么它的区块哈希值也就变了,后面的区块的原来保存的前一区块的区块哈希值就无法指向这个被改变的区块,意味着区块链断裂了。除非后面的区块里保存的前一区块的区块哈希值也被改为改动后的区块哈希值,这样,区块链才能保持连接状态。
另一方面,区块链可以运行在至少1个节点上,如果区块链运行在多个节点上,哪怕其中一个节点改变了自己的区块链上的数据,那么它的区块链的数据,也就是区块链账本,就会和其它节点的区块链账本不一样,这样,就会形成区块链的硬分叉,形成2条不同的区块链。这也是区块链的数据难以被篡改的原因之一。当然,如果区块链运行在1个节点上的时候,区块链的数据还是可以直接被修改的,但只有1个节点的区块链,也说不上去中心化了,和中心化的系统没有太大区别,只是数据修改起来更麻烦一点。
1.4 区块链的结构形态
区块链一般是以链式结构存在的,即后一个区块有一个指向前一个区块的区块哈希值,和前一个区块关联起来,形成一条直线的链。除非发生硬分叉,这条链才会在某个区块形成分叉,分叉成两条链,像一棵二叉树。但需要注意的是,链式结构并不是区块链唯一存在的结构形态。除了链式结构,目前区块链的另一种结构形态是有向无环图(Directed Acyclic Graph,DAG)。简单地说,有向无环图指的是一个无回路的有向图,它由有限个顶点和“有向边”组成,从任意顶点出发,经过若干条有向边,都无法回到该顶点,这种图就是有向无环图。
上图中的有向无环图和普通有向图的区别在于:普通有向图里有些节点形成了回路
1.5 区块链使用了哪些技术
区块链使用的技术有:分布式数据库、点对点传输、非对称性加密算法、共识算法、智能合约。其中,分布式数据库、点对点传输、非对称性加密这3种技术在区块链诞生前就已经存在了,共识算法、智能合约这2种技术是区块链新引入的。区块链技术实际上是把上面这5种技术巧妙地结合在一起。
分布式数据库:一个区块链系统由多个分布式节点构成(可以认为区块链系统是一个多节点的系统,对外提供服务的节点有多个,并且节点数可以无限扩展;但不一定是所有的节点都参与共识算法来验证交易数据),每个分布式节点都拥有一个分布式数据库。
点对点传输:节点之间通过点对点传输技术来进行信息传输。
非对称性加密:区块链系统中的每个用户都有自己的私钥(相当于密码,由用户自己单独拥有,非公开的)和公钥,公钥可以通过私钥使用非对称性加密算法推导出来。私钥和公钥之间的关系依赖于非对称性加密算法。钱包地址(相当于银行账号,公开的)可以通过公钥得到。
共识算法:共识算法是在分布式系统中用于解决参与者之间达成一致的算法。常见的共识算法包括:工作量证明(Proof of Work,PoW),权益证明(Proof of Stake,PoS),委托权益证明(Delegated Proof of Stake,DPoS),联邦拜占庭(Federated Byzantine Agreement,FBA )等,详细可以参考我的这篇文章:
各种主流区块链共识算法大比拼 - 知乎
智能合约:智能合约就像是一种编程的方式,它是在区块链上执行的自动化合约,其中包含了双方合同条款的规则和逻辑。一旦满足了预定条件,智能合约就会自动执行,无需第三方干预。智能合约通常基于区块链平台上的特定协议编写,并且被存储在区块链上。它们的执行依赖于区块链上的节点,因此具有分布式、透明、安全、不可篡改的特点。智能合约有许多应用场景,比如数字货币交易、资产转让、保险理赔等。它们可以自动化和确保交易的执行,减少人为干预和减轻人力成本。
2 通证
通证(Token)是指在区块链中使用的数字资产,它可以代表某种价值或拥有某种权益。通证是构建区块链生态系统的一种重要工具,它可以用于表示某种权益、交换价值、激励参与者等。
通证可以有不同的形式和功能,以下是一些常见的通证类型:
- 代币(Token):代币是区块链中最常见的通证类型之一,可以用来表示某种价值或资产。代币可以在区块链上进行创建、传输和销毁,可以用于支付、投资、治理权益等。
- 不可替代通证(Non-Fungible Token,NFT):又叫非同质通证。NFT是一种独特且不可互换的通证,每个NFT都有其独特的价值和属性。NFT常用于表示艺术品、游戏道具、虚拟地块等独特的数字资产。
- 安全通证(Security Token):安全通证是通过区块链发行的符合证券法规的数字证券,代表着某种权益,如股份、债券、房地产等。安全通证可以提供更高的透明度、流动性和可编程性。
- 使用权通证(Utility Token):使用权通证是一种用于访问和使用特定平台或应用服务的通证。持有使用权通证的用户可以使用它们访问平台的功能或获取相应的特权和优惠。
通证的功能和用途可以因其类型和所属区块链平台的不同而有所差异。它们可以促进价值交换、建立经济激励机制、实现去中心化治理等。通过通证化,人们可以更方便地交换和管理数字资产,推动更广泛的创新和参与。
其实,更广义的通证概念包含了更大的范围,它代表的是一种权利和权益,并不限于在区块链中使用的数字资产,它还包括了证券市场上的证券、日常生活中的优惠券和积分、虚拟币(如QQ币)等。
网上流行着另一种说法:就是某条链上的原生代币就叫做coin,即币。在这条链上发行的其它代币叫做token,即通证。例如:以太坊这条链上的原生代币就叫做以太币,即eth。在以太坊这条链上发行的其它代币就叫做通证。我个人认为这样的概念划分不太准确。我认为币只是通证这个概念的其中一种表现形式,通证不限于币,更广泛地表示一种权益。对于以太坊这条链,不管是原生代币eth,还是在以太坊这条链上发行的其它代币,都可以叫做币。当然,这只是我个人的理解。
3 区块链和通证的关系
区块链是通证的载体,通证在区块链上发行。每条区块链可以发行多种通证,而区块链也不是只有一条,可以有多种不同类型的区块链。区块链和通证这个关系就好比证券交易所和股票的关系,一个证券交易所可以发行多股票,证券交易所也可以有多个,当然这个比喻不一定恰当。
更多区块链方面的文章,可以看我的学习笔记 :www.0101.vip
----------------------------------------------------------------------------------
我是powervip,区块链程序员
我的公 众 号 和 知 识 星 球:区块链战斗机
我的知乎:powervip - 知乎
我的学习笔记:www.0101.vip
原创作品,版权所有,侵权必究!商业转载请联系作者获得授权;非商业转载需保留作者署名信息,注明出处并保留原文链接。
写作不易,喜欢我写作内容的朋友,请帮忙点 “ 赞同 ” 按钮,谢谢!
你的鼓励,我的动力!