闲来无事收集整理
目录
-
理解区块链,比特币
什么是区块链?
简单的说,区块链就是一种去中心化的分布式账本数据库。去中心化 与传统中心化的方式不同,这里是没有中心,或者说人人都是中心。分布式账本数据库是指记载方式不只是将账本数据存储在每个节点,而且每个节点会同步共享复制总个账本的数据。
区块链技术本质上是一种数据库技术。每个区块就像一个硬盘,把信息全部保存下来,再通过密码学技术进行加密。这些被保存的信息就无法被篡改。
一个比喻让你理解区块链
以前:你们家里有个账本,你一人来记账。爸爸妈妈把工资交给你,你记到账本上。中间万一你贪吃,想买点好吃的,可能账本上的记录就会少几十块钱。
利用区块链技术后:相当于全家总动员的方式记账。你记账,爸爸也在记账,妈妈也在记账,他们都能看到总账。你不能改,爸爸妈妈也不能改。这样想买烟抽的爸爸和贪吃的你都没办法啦。
区块链的特点
安全:区块链不受任何人或实体控制,数据在多台计算机上完整的复制(分发),攻击者没有一个单一的入口点,数据安全性更有保障
不可篡改:一旦进入区块链,任何信息都无法更改,甚至管理员也无法修改此信息。
可访问:网络中所有节点都可以轻松访问信息。
无第三方:区块链的去中心化可以帮助点对点交易。因此,无论是交易还是交换资金,都无需第三方的批准,区块链本身就是一个平台。
区块链就是比特币?
比特币:一种P2P形式的数字货币,不依靠特定货币机构发行,而是依据特定算法,通过大量计算产生,经由整个P2P网络中介多节点构成的分布式数据库来确认并记录交易行为,并使用密码学的设计来确保货币流通各个环节的安全性。
因此,比特币是区块链的一种呈现方式,区块链并不等于比特币。区块链是比特币的底层技术和基础架构,而比特币是区块链的一种应用,但并不意味着区块链只能应用到比特币上。
区块链对未来生活有什么影响?
不需要繁琐的个人证明:原来我们的出生证、房产证、婚姻证等,一旦跨国就可能失效了。区块链不可篡改的特性从根本上改变了这一情况,出生证、房产证、婚姻证都可以在区块链上公证,变成全球都信任的东西。
看病避免反复检查:简单说就是利用区块链建立有时间戳的通用记录存储库,达到不同数据库都可以提取数据信息的目的。例如你去看病,不用换个医院就反复检查,也不用为报销医保而反复折腾,节省时间和开销。
旅行消费更便捷:我们经常会用某些app来寻找酒店和其他服务,各个平台从中获得提成。区块链的应用正是除去中间商,并为服务提供商和客户提供创建安全、分散的方式,达到直接进行连接和交易的目的。
交易无需第三方:区块链可以让交易和支付变得更高效、更便捷。区块链平台允许用户创建在满足某些条件时变为活动的智能合约。这意味着当交易双方同意满足其条件时,可以释放自动付款。
商品来源可追溯:假如你购买了一个苹果,在区块链技术下,你可以知道从果农的生产到流通环节的全过程。在这其中有政府的监管信息、有专业的检测数据、有企业的质量检验数据等。
保护版权更有效:创作者把作品放到区块链上,一旦有人使用了他的作品,他立刻就能知道。相应的版税也会自动支付给创作者。区块链技术既保护了版权,有有助于创作者更好更直接地向消费者售卖作品。
-
比特币协议
产生原理
从比特币的本质说起,比特币的本质其实就是一堆复杂算法所生成的特解。特解是指方程组所能得到有限个解中的一组。而每一个特解都能解开方程并且是唯一的。以钞票来比喻的话,比特币就是钞票的冠字号码,你知道了某张钞票上的冠字号码,你就拥有了这张钞票。而挖矿的过程就是通过庞大的计算量不断的去寻求这个方程组的特解,这个方程组被设计成了只有 2100 万个特解,所以比特币的上限就是 2100 万个。
矿工
比特币系统是建立P2P(点对点)网络结构之上的货币,任何人都可以选择加入网络,转账,甚至参与授权交易。比特币安全的关键之处在于它能够抵御攻击者以多重虚假身份加入系统的行为。毕竟,任何人都可以下载比特币的源码,成为一个比特币节点,而无需向其他人表明身份。为了解决这个问题,该协议要求加入系统的节点展示出“工作量证明”:付出算力**密码学难题以获得比特币协议的参与资格。从事这种“工作量证明”的节点被称为矿工。
挖矿
持有比特币并希望转账的用户可以将交易信息(通过他们安装在计算机或智能手机上的软件)发送到比特币网络上的一个节点。比特币网络中的活跃节点从用户那里收集这些交易信息并将它们分发到网络中的对等节点——分发方式是每个节点仅通知那些与请求转账所关联的节点。交易信息被批量的汇聚,称为区块,而区块又被链接在一起形成区块链,从而形成所有被接受的比特币交易记录。区块链中的每个区块都通过前置区块的哈希值(实际上也是前驱区块的唯一标识符)引用其前驱区块。比特币网络中的每个节点都保存着完整的区块链副本。区块创建的过程被称为挖矿,挖矿的作用之一相当于新币的印刷,也就是所谓的造币。
激励机制
比特币的协议规则使区块的创建非常困难:只有当区块包含密码学难题的答案时,才被认为是合法的。作为报酬,每当矿工成功创建区块时,他们都会得到比特币奖励。报酬由两部分组成:一部分是新造比特币,一部分是从区块所包含的交易中抽取的挖矿手续费。目前的造币率是12.5比特币每区块,这一数额大约每四年减半。随着这一数额的减少,比特币开始越来越依赖挖矿手续费来支付矿工。
加密
比特币使用数字签名来确保只有比特币的所有者可以使用它们。 比特币地址的所有者具有与该地址相关联的私钥。 为了花费比特币,他们用这个私钥签署交易,证明他们是所有者。公钥与每个比特币地址相关联,任何人都可以使用它来验证数字签名
交易方式
比特币是类似电子邮件的电子现金,交易双方需要类似电子邮箱的“比特币钱包”和类似电邮地址的“比特币地址”。和收发电子邮件一样,汇款方通过电脑或智能手机,按收款方地址将比特币直接付给对方。
比特币地址是大约33位长的、由字母和数字构成的一串字符,总是由1或者3开头,例如"1GyQZPCGYMTmqY7NFhdWUrScyadRdz8WJD"。比特币软件可以自动生成地址,生成地址时也不需要联网交换信息,可以离线进行。可用的比特币地址非常多。
比特币地址和私钥是成对出现的,他们的关系就像银行卡号和密码。比特币地址就像银行卡号一样用来记录你在该地址上存有多少比特币。你可以随意的生成比特币地址来存放比特币。每个比特币地址在生成时,都会有一个相对应的该地址的私钥被生成出来。这个私钥可以证明你对该地址上的比特币具有所有权。我们可以简单的把比特币地址理解成为银行卡号,该地址的私钥理解成为所对应银行卡号的密码。只有你在知道银行密码的情况下才能使用银行卡号上的钱。所以,在使用比特币钱包时请保存好你的地址和私钥。
比特币的交易数据被打包到一个“数据块”或“区块”(block)中后,交易就算初步确认了。当区块链接到前一个区块之后,交易会得到进一步的确认。在连续得到6个区块确认之后,这笔交易基本上就不可逆转地得到确认了。比特币对等网络将所有的交易历史都储存在“区块链”(blockchain)中。区块链在持续延长,而且新区块一旦加入到区块链中,就不会再被移走。区块链实际上是一群分散的用户端节点,并由所有参与者组成的分布式数据库,是对所有比特币交易历史的记录 。
-
比特币技术要点
比特币系统架构
比特币系统分为6层,由下至上依次是存储层、数据层、网络层、共识层、RPC 层、应用层。
其中,存储层主要用于存储比特币系统运行中的日志数据及区块链元数据,存储技术主要使用文件系统和 LevelDB。
数据层主要用于处理比特币交易中的各类数据,如将数据打包成区块,将区块维护成链式结构,区块中内容的加密与哈希计算,区块内容的数字签名及增加时间戳印记,将交易数据构建成 Merkle 树,并计算 Merkle 树根节点的哈希值等。
区块构成的链有可能分叉,在比特币系统中,节点始终都将最长的链条视为正确的链条,并持续在其后增加新的区块。
网络层用于构建比特币底层的 P2P 网络,支持多节点动态加入和离开,对网络连接进行有效管理,为比特币数据传输和共识达成提供基础网络支持服务。
共识层主要采用了 PoW(Proof Of Work)共识算法。在比特币系统中,每个节点都不断地计算一个随机数(Nonce),直到找到符合要求的随机数为止。在一定的时间段内,第一个找到符合条件的随机数将得到打包区块的权利,这构建了一个工作量证明机制。
RPC 层实现了 RPC 服务,并提供 JSON API 供客户端访问区块链底层服务。
应用层主要承载各种比特币的应用,如比特币开源代码中提供了 bitcoin client。该层主要是作为 RPC 客户端,通过 JSON API 与 bitcoin 底层交互。除此之外,比特币钱包及衍生应用都架设在应用层上。
比特币数据结构
一个完整的比特币区块结构主要由以下几部分构成:
|
数据项 |
字节 |
字段 |
说明 |
|
Magic NO |
4 |
魔数 |
常数0xD9B4BEF9 |
|
Blocksize |
4 |
区块大小 |
用字节表示的该字段之后的区块大小 |
|
Blockheader |
80 |
区块头 |
组成区块头的几个字段 |
|
Transaction counter |
1-9 |
交易计数器 |
该区块包含的交易数量,包含coinbase交易 (一个区块第一个交易规定为coinbase交易,即由挖矿产生的比特币奖励) |
|
Transactions |
不定 |
交易数据 |
记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致 |
其中区块头的结构由以下几部分构成:
|
字节 |
字段 |
说明 |
|
4 |
版本 |
区块版本号,表示本区块遵守的验证规则 |
|
32 |
父区块头HASH |
前一区块的哈希值,使用SHA256(SHA256(父区块头))计算 |
|
32 |
Merkle根 |
该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算 |
|
4 |
时间戳 |
该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块 |
|
4 |
难度目标 |
该区块工作量证明算法的难度目标,已经使用特定算法编码 |
|
4 |
Nonce |
为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数 |
区块中交易数据结构由几下几部分构成:
|
字节 |
字段 |
子字段 |
子字段 |
说明 |
|
4 |
版本 |
|
|
这笔交易参照的规则 |
|
1-9 |
输入计数器 |
|
|
包含的交易输入数量 |
|
不定 |
输入 |
|
|
|
|
32 |
哈希 |
|
引用交易哈希值 |
|
|
4 |
索引 |
|
引用交易输出索引 |
|
|
不定 |
解锁脚本(coinbase) |
|
|
|
|
1-9 |
签名长度 |
数字签名长度 |
||
|
72 |
签名值 |
私钥签名 |
||
|
不定 |
解锁脚本(普通) |
|
|
|
|
1-9 |
签名长度 |
数字签名长度 |
||
|
72 |
签名值 |
私钥签名 |
||
|
1-9 |
公钥长度 |
|
||
|
65 |
公钥数据 |
|
||
|
4 |
*** |
|
默认:0xFFFFFFFF |
|
|
8 |
输出 |
比特币数量 |
|
|
|
1-9 |
锁定脚本长度 |
|
|
|
|
|
锁定脚本(P2PK) |
|
|
|
|
1-9 |
公钥长度 |
|
||
|
65 |
公钥 |
|
||
|
1 |
操作符0 |
|
||
|
|
锁定脚本(P2PKH) |
|
|
|
|
1 |
|
操作符1 |
|
|
|
1 |
|
操作符2 |
|
|
|
1-9 |
|
地址长度 |
|
|
|
20 |
|
公钥地址 |
|
|
|
1 |
|
操作符3 |
|
|
|
1 |
|
操作符4 |
|
密码学
区块链技术离不开密码学,可以说密码学是区块链系统的基石之一
加密与解密
加密与解密技术是对信息进行编码和解码的技术。编码的过程即加密的过程,加密模块把可读信息(即明文)处理成代码形式(即密文)。解码的过程即解密的过程,解密模块把代码形式(即密文)转换回可读信息(即明文)。在加密和解密的过程中,**是非常关键的角色。
目前,加密技术主要分为对称加密,非对称加密和不可逆加密三类算法。
对称加密算法:在对称加密算法中,加密和解密的**相同。对称加密技术有两种基本类型:分组密码和序列密码。对称加密算法的特点是算法公开、计算量小、加密速度快。不足之处是,交易双方使用相同的**。
非对称加密算法:使用两把完全不同但又完全匹配的一对钥匙,称之为公钥和私钥,公钥和私钥成对配合使用。数字签名技术就是以非对称加密算法为基础的。
不可逆加密算法:加密过程中不需要使用**,输入明文后经过加密算法处理成密文,加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样的不可逆加密算法处理,得到相同的加密密文。
哈希:哈希函数也称之为散列函数,散列函数是可以将任意大小的数据映射到固定大小数据的任何函数。作为加密算法的一种,散列函数是一种单向密码体制,即从一个明文到密文的不可逆映射,只有加密过程,没有解密过程。散列函数的返回值成为散列值、哈希代码、摘要。散列函数的主要特点是:压缩性强、计算简单、计算结果单向性。
Merkle树
在密码学中,哈希树或Merkle树是一种树,其中每个叶子节点都标记有数据块的哈希,而每个非叶子节点都标记有其子节点标签的加密哈希。Merkle树允许对大型数据结构的内容进行有效、安全的验证,是散列列表和散列链的泛化。如果需要证明某个区块上是否存在一笔交易Data3(如上面区块结构所示,我们是可以拿到Merkle树根的哈希值),那么我们只需要Node B,Node G的哈希值构成的Merkle路径就可以证明,过程如下:
Step1:获取交易Data3的哈希值,Node F=Hash(Data3)
Step2:通过Node F和Node G的哈希值,得到父节点的哈希值:Node A=Hash(B+C)
Step3:然后将上一步得到的根哈希值对比区块头中MerkleTree的根哈希值,如果相同,则证明该区块中存在交易Data3,否则说明不存在
Merkel树的结构图:
P2P网络
比特币的网络采用了基于国际互联网(Internet)的P2P网络架构。英文是peer to peer,所以也叫对等网络。顾名思义也就是网络中的每台计算机是对等的,各个节点共同提供网络服务,不存在任何“特殊”节点。在 P2P 网络中不存在任何服务端(server)、中央化的服务、以及层级结构。这也是比特币网络或者说区块链的一个重要特征——去中心化。 这样网络中的任何一台机器出现问题都不会影响其他节点,保证网络的正常运行。
既然每个网络节点都是平等的(是指在网络层面上节点是平等的,但各节点在功能上可以有不同的分工, 如钱包节点、挖矿节点等),不存在任何“特殊”中心节点,那么当新的网络节点启动后,它是如何跟其他的节点建立连接,从而加入到比特币网络呢?
在中心化网络中,新加入的节点只要连接“特殊”的中心节点就可以加入网络。
为了能够加入到比特币网络,比特币客户端会做一下几件事情:
1.节点会记住它最近成功连接的网络节点,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。
2.节点会在失去已有连接时尝试发现新节点。
3.当建立一个或多个连接后,节点将一条包含自身IP地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点,从而保证节点信息被多个节点所接收、保证连接更稳定。
4.新接入的节点可以向它的相邻节点发送获取地址getaddr消息,要求它们返回其已知对等节点的IP地址列表。节点可以找到需连接到的对等节点。
5.在节点启动时,可以给节点指定一个正活跃节点IP, 如果没有,客户端也维持一个列表,列出了那些长期稳定运行的节点。这样的节点也被称为种子节点(其实和BT下载的种子文件道理是一样的),就可以通过种子节点来快速发现网络中的其他节点。
比特币节点通常采用TCP协议、使用8333端口与相邻节点建立连接, 建立连接时也会有认证“握手”的通信过程,用来确定协议版本,软件版本,节点IP,区块高度等。
分布式一致性与共识算法
区块链系统本质上是分布式网络系统,而在分布式系统中,最核心的问题就是“一致性的问题”,即在分布式网络的各个节点中如何保持节点数据的一致性。如果在分布式系统中,一致性无法保证,那么分布式系统就变成了不可用的系统,因此保证一致性是分布式系统中最为重要的内容。目前,各类分布式系统中所使用的分布式一致性算法比较多,但基本都源于Paxos分布式一致算法。
在区块链中,实现各个节点数据一致性的算法称之为共识算法。比特币系统基于PoW(Proof of Work)算法来实现其共识机制。
在比特币系统中,PoW算法的过程可以理解为不断调整Nonce值。调整Nonce值就是对区块头做双重SHA-256哈希运算,使得结果满足给定数量前导0的哈希值的过程。其中前导0的个数,取决于挖矿难度,前导0的个数越多,挖矿难度更大。
具体处理逻辑如下:
1.生成铸币交易,然后与其他所有准备打包进区块的交易一起组成交易列表。随后基于交易列表中的数据生成Merkle树,并计算Merkle树根节点的哈希值。
2.将Merkle树根节点的哈希值与其他字段(如区块高度、时间戳等)组成区块头,将80字节长度的区块头作为PoW算法的输入。
3.不断变更区块头中的随机数Nonce,对变更后的区块头做双重SHA-256哈希运算。将得到的结果与当前难道的目标值做比对,如果小于目标难度,即PoW算法完成。
4.在一定时间段内率先完成PoW算法的区块向全网广播,其他节点验证其是否符合规则,如果验证有效,其他节点将接收此区块,并附加在已有区块链之后,随后开启下一轮挖矿。
区块的存储
比特币存储是系统由普通文件和LevelDB数据库组成的。普通文件用于存储区块数据,LevelDB数据库用于存储区块元数据。区块数据每个文件的大小是128MB。每个区块的数据(区块头和区块里所有交易)都会序列成字节码的形式写入dat文件。