首页 » 技术分享 » 区块链自学笔记(一)系统篇

区块链自学笔记(一)系统篇

 

金融发展过程:便于理解比特币

1.物物交换的时代:

2.实体货币:

稀有贝壳、稀有金属(金,银)

稀缺,容易分割

3.传统货币:

金属货币:

纸币(由国家背书):

国家发行,有可能产生通货膨胀(钱币发行量激增),购买力下降。

电子金融:银行IC卡,支付宝,微信。由国家(中心机构)控制。

比特币诞生背景:

为脱离中心机构,用技术的发展取代国家在货币发行领域的统治地位。

1.技术储备:加密技术、网络技术、共识算法,没有一个是中本聪发明的,但是他完成了技术融合,他是密码学的“乔布斯”。

2.密码朋克组织(1993年):加密电子邮件系统,里面多是电脑黑客、密码学专家和追求隐私的狂热者,阿桑奇,万维网支付等人位列其中。

在比特币之前已经有的数个电子支付系统:

1)Ecash(1990):注重密码学网络支付系统,但是依赖中心机构。

2)B-money(1998):是比特币的精神先导,但是未解决发行货币问题。

3)比特现金(2005):提出竞争数学难题,构建认证系统,但是他不会编程,无人响应。

4)哈希先进算法机制:限制垃圾邮件发送与拒绝服务攻击,后被改进为pow共识机制。

3.金融危机(政治因素):2008年金融危机,美国政府增发美元,财富缩水,人们对政府失去信心。

4.为何适合作为金容货币:

1)不可重复花费,价值移植(UTXO:Unspend Transaction Output 未花费输出)

2)交易不可伪造(校验严格,工作量证明。即使拥有51%的算力,为了自己的利益也没有太大可能被伪造)

3)可分性1BTC = 10^8聪(satoshi)

4)通过挖矿来实现货币的货币(最初每个块奖励50个比特币,每四年衰减,目前奖励12.5个比特币--2018)

5)货币数量有限,无通胀风险,反而有可能通货紧缩(秘钥丢失)

比特币基本信息:bitcoin(BTC)、Bitcoin(区块链)

比特币交易简单介绍:

与传统记账方式相比:

Q:区块是什么?

-记录多条交易的一页账单

Q:区块链是什么?

-按照时间顺序将多个账单装订在一起形成的账本

比特币与区块链的关系:

1.比特币是区块链技术的应用。

2.区块链是协议。

3.区块链是由比特币的底层支撑系统。

4.区块链是从比特币抽离出来的概念,由比特币产生。

比特币(区块链)使用基本技术:

1.哈希算法(用于工作量证明):

作用:将任意长度的输入格式化为固定长度的16进制在字符串。

主流算法:md5(Message-Digest5)32*4位、sha256(比特币)64位*4、sha1、sha254等

性质:

不可逆:当你知到x的HASH值,无法求出x。(无法倒推)

无冲突:当你知道x,无法求出一个y,使x与y的HASH值相同。(不同内容的hash值一定不同)

(注:以上两个性质计算上是即成立的,数学上是不成的)

2.密码学(用于资产所有权和交易验证):

对称加密:

主流算法:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES

优点:效率高。

缺点:容易被劫持,存在风险。

非对称加密(duke:openssl 生成公钥私钥):

介绍:公钥私钥一一对应,公钥负责加密,对外公开,思钥用于加密和签名,仅自己持有,绝不能外漏。

公钥作用:加密,保护隐私。

私钥作用:保证数据来源、保证数据未被篡改。

比特币节点间验证交易流程图:

主流算法:RSA算法、椭圆曲线算法(比特币)

应用:

数字证书(CA认证):

http://www.blogjava.net/freeman1984/archive/2012/07/24/383817.html

比特币地址:

一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥k是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭圆曲线乘法这个单项加密函数阐释一个公钥K。有了公钥K,我们就可以使用一个单项加密哈希函数声场比特币地址A。

中本聪比特币地址:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

比特币区块地址查询:https://blockchain.info/block-height/621109

3.P2P网络(用于广播交易,同步账本):

介绍:点对点技术,无中心服务器,依靠用户群交换信息的互联体系。网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源通过网络提供服务和内容,能被其他对等节点(Peer)直接访问而无需经过中间实体。在此网络中的参与者既是资源、服务和内容的提供者(Server),又是资源、服务和内容的获取者(Client),P2P体系结构式应用层概念。

特点:耐攻击,高容错,地位平等。

应用:BT下载,电驴下载。

4.默克尔树(用于快速验证交易):

介绍:Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值得一棵树。Merkle树的叶子是数据块的hash值。

特点:二叉树。

应用:可快速检索,尤其是在数据量猛增时,搜索效率高(在毕业必中用来快速校验某一比交易是否存在与某个block中)。

比特币相关参数:

1.区块大小上限1M

2.总计2100万枚,2140年挖完

3.每10分钟出一个区块,通过难度值调整实现

4.21万个区块后奖励减半,大约四年,目前奖励12.5(2018年)

5.1btc = 10^8聪

比特币价值的计算:

package main
import "fmt"
//以10分钟为一个区块的间隔,210000个块共约四年时间
const reward_interval = 210000
func main() {
    totalAmount := totalBTC()
    fmt.Println("Total BTC to ever be created : ", totalAmount)
}
func totalBTC() float64 {
    //50 BTC = 50 0000 0000 Satoshis
    var current_reward float64 = 50
    var total float64 = 0
    for current_reward > 0 {
        total += reward_interval * current_reward
        current_reward /= 2
    }
    return total
}

比特币区块结构:

1.区块结构:

注意:比特币的区块大小目前被严格限制在1MB以内。4字节的区块大小字段不包含在此。

2.区块头(Block Header):

注意:区块不存储hash值,节点接收区块后独立计算并存储在本地。

3.区块体(Transactions):

1)Coinbase交易:第一条交易,挖矿奖励矿工

2)普通转账交易:每笔交易包括付款方、收款方、付款金额、手续费等等

4.区块完整图示:

5.创世块:整个链条中的第一块

比特币交易的详细流程:

Alice是一个客户,她想买一杯咖啡,向Bob支付0.1个比特币,具体过程如下:

Alice登录自己的钱包(比特币客户端,或者其他比特币钱包),输入对方Bob的地址(相当于银行卡号),输入转账金额0.1BTC,选择交易手续费(手续费可以为零,那么这条交易被写入区块链的优先级会降低,转账就会被延迟),点击发送,那么这条交易就会被发送到比特币网络中去,当某个矿工收到这笔交易之后,会先校验一下这笔交易的有效性(校验过程我们后续再讲),当确定这是一笔有效的交易之后,会把这笔交易暂存到本地的“待确认交易池”中,同时将这笔交易广播到其他节点,每一个节点都可以独立验证这笔交易的有效性,然后再向外传播,通过这种P2P网络,这笔交易迅速的在整个网络中发布。当一个新的挖矿周期开始时(10分钟),矿工会从“待确认交易池”中取出合适的交易,将交易打包,随即开始挖矿,即做哈希碰撞,试图最先找到那个符合条件的目标数字,一旦某个矿工A算出这个数值,矿工A便向整个网络公布结果,所有其他矿工收到这条消息后,立刻停止运算,验证这个数值是否有效,当其他节点确认该数值有效后,矿工A得到记账权,将他打包的区块添加到区块链上,同时获得新生的比特币奖励,整个网络同步最新的账本,随即进入下一轮挖矿竞争中去,循环往复。

当包含Alice的这笔转账的区块被矿工写入到区块链之后,Bob的账户中便会收到Aclie的转账。实际网络中,一般建议在收到付款后,再等6个区块确认之后再支付商品,Bob才能使用这笔转账,这是比特币系统为了安全而设置的限制,才能保证交易不可逆,不会出现双花问题。

流程图如下:

比特币交易:

1.未消费输出(UTXO):

UTXO:unspent transaction output, 是比特币交易中最小的支付单元,不可分割,每一个UTXO必须一次性消耗完,然后生成新的UTXO,存放在比特币网络的UTXO池中。

比特币交易的基本单位是未经使用的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币货币。比特币网络监测着以百万为单位的所有可用的(未花费的)UTXO。当一个用户接收比特币时,金额被当作UTXO记录到区块链里。这样,一个用户的比特币会被当作UTXO分散到数百个交易和数百个区块中。实际上,并不存在储存比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO。“一个用户的比特币余额”,这个概念是一个通过比特币钱包应用创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。UTXO被每一个全节点比特币客户端在一个储存于内存中的数据库所追踪,该数据库位被称为“UTXO”集或者“UTXO池”。新的交易从UTXO集中消耗(支付)一个或多个输出。

2.交易:

交易结构:

多种交易形式:

1)普通交易:

Alice产生交易,Output0将钱转给Bob,Output1再把找零重新转回Alice。

2)多对一:

将多个小额的输入集体作为一个大的输出。

3)一对多:

一个输入,多个输出。

TXInput:指明交易发起人可支付资金的来源,包含:

1)引用utxo所在交易的ID

2)所消费utxo在output中的索引

3)解锁脚本(签名)

TXOutput:包含资金接收方的相关信息,包含:

1)接收金额

2)锁定脚本(用地址进行锁定)

代码查看交易(json):

{
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
      "sequence": 4294967295
    }
 ],
  "vout": [
    {
      "value": 0.01500000,
      "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": 0.08450000,
      "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }
  ]
}

0.015 + 0.0845 = 0.095,0.1 - 0.095 = 0.005(手续费)

浏览器查看交易:

UTXO消费和产生过程:

Cherish发起交易,创建了一个utxo,包含3BTC并用Alice的地址进行锁定,此utxo会被放进UTXO池中(2)。Lily发起交易,创建了一个utxo,包含6BTC并用Alice的地址(公钥)进行锁定,此utxo会被放进UTXO池中(1)。Alice发起交易,钱包在后台遍历整个区块链,在UTXO集中寻找能够支配的utxo(1+2),作为输入input,包含交易来源(由ID和索引锁定)、以及Alice的签名。输出时,向Bob转8BTC,由于之前的两个utxo为6+3,则Alice发起交易产生两个utxo,一个包含8BTC,用Bob地址锁定,广播到网络中去。另一个包含1BTC,用Alice地址锁定,广播到网络中去。当UTXO被比特币网络确认,广播到网络,两个utxo就会被放到UTXO池中(创建)(3,4),原来的两个UTXO将会被销毁(1,2),UTXO集会被存储在整个比特币网络中数百个交易中,全网共识,完成销毁和创建。

解决双花问题(Double-Spending)(一份钱花两次,需要通过中心机构控制):

时间戳+utxo(utxo是未花费的输出,可以保证资产在比特币系统中的转移,而不是复制。每一笔资产都是通过对方的公钥--地址进行锁定。并放到比特币系统中,全网都可见utxo,但只有持有私钥的才能解开和使用utxo。才能保证销毁和创建完成资产的转移。)只有节点之间验证花费。

1)已经确认的交易时(utxo)

2)尚未确认交易时(时间戳)

3)被两个节点同时挖出,比特币链条会分叉

4)被两个节点同时挖出(立即化身为矿工连追两个区块,变成最长链),解决办法,等6个区块后再交付产品

参考链接:https://www.cnblogs.com/10zhang/p/8616991.html

双花的四种情况:

1.一笔钱支付得到区块的确认,再去花这笔钱utxo认证这笔钱已经被花完了,就会拒绝支付。

2.如果发起交易广播在网络并完成验证但还没有写入到区块中,同一个广播网络有两笔同样的交易,utxo会按照时间戳只会接收第一笔交易,认为第二笔是无效的,写入时就会被拒绝。(时间戳)

3.向网络中广播交易,之后立刻向另外的网络广播同一笔交易(网络1:A->B正常支付获得产品,网络2:A->A支付失败),则系统就有可能由不同的矿工把两笔交易分别打包到自己的区块中。当两个区块同时挖出矿,两笔交易同时出现在矿中,会出现分叉问题(几率非常小)。则会保存这两个区块,等到下一个区块生成(如果依然分叉则继续等待下一个区块),当某一个分叉变为最长链的一部分,另一个分叉部分将会被废弃,那些矿工也不会得到奖励(扑块)。(比特币大约10分钟出一块,以太坊大约14秒出一块,以太坊为鼓励矿工,扑块的矿工也会得到比较少的奖励)

4.发起了一笔交易,A->B对方收到了这笔钱得到产品,之后立刻化身矿工去连续追加块A->A,使此块所在的链变为最长链,让接下来的新矿工认为此块所在的链是最长的并在此追加,完成双花。比特币为防止此情况发生,建议支付块完成后等六个块完成确认之后再完成交易交付商品。此时伪造的块追加将很难追的上全网维护的最长链。(工作量证明)

解决拜占庭将军问题:

如何让多个完全平等的节点,针对对某一状态达成统一共识。

在比特币里体现为:如何对一个账本达成一致,认为这个账本是可靠的。

1)数字签名:无法伪造,投入网络全网都可以验证,来源可靠。

2)最长链机制:长度达到半数即可认为可靠。比特币中因为无法得知全网节点维护,故选择最长链为可靠链。

3)POW机制:保证同一时间只有一个人签名,添加节点/账本。同时增加了签名的工作成本--工作量证明。

参考音频:http://www.ximalaya.com/42927243/sound/77088893/

转载自原文链接, 如需删除请联系管理员。

原文链接:区块链自学笔记(一)系统篇,转载请注明来源!

0