Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

区块链技术与应用:系统实现

小饱1
78 0 0
基于交易 transaction-based ledger的账本模式:4 E" z  ~$ @& K( u6 I( Y! {2 A1 j
比特币采用的是基于交易 transaction-based ledger的账本模式?。每个区块中记录的是交易信息,转账交易,铸币交易。但是没有记录某个账户中有多少钱,需要根据交易记录去推算。区块链中一共有多少往某账户的地址转账的交易,转入多少币,这些币中又有多少被花掉,推算出余额。4 M. d, t: G* o" P  F1 ~7 |- i# h
比特币中全节点要维护一个UTXO的数据结构(Unspent Transaction Output),是由还没被花掉的交易的输出组成的集合。一个交易可能有多个输出,如下:
& h- D& {; |$ t- H! ?  |A→B (5BTC)  花掉了,不在UTXO中。      B→D (5BTC)  在UTXO中。3 p0 G! g" k% G
→C (3BTC)  在UTXO中。
1 v6 o$ }: ]. w, A" R5 DUTXO为了检测double spending,想要花掉的币必须在这个集合中才是合法的,如果不在集合中要么不存在,要么被花过。全节点要在内存中维护UTXO结构。
6 l- s  G! n1 Y  j$ `) e: [1 N' r随着交易的发布,每个交易会消耗一些UTXO输出,也会产生新的输出。
7 U. D; `+ @& Q每个交易可以有多个输入,也可以有多个输出。所有输入的金额要等于所有输出的金额,即 total inputs = total outputs。有些交易会出现input > output,那么这个差额就是作为交易费给获得记账权的节点。
  G& D" b) z) g7 [比特币系统的激励机制:1.block reward   2.transaction fee(这也是为什么获得记账权的节点会打包别人的交易)
4 l0 }8 h4 ^1 b) q1 ~9 y4 @! t目前来说,获得记账权的目的还是为了得到block reward,12.5BTC,但是这个奖励每21万个区块会减半,大概是4年时间(21w10min) / (60min24h*365d)。很多年之后block reward就会变得非常小,到那时transaction fee可能就会变成主要奖励。1 p+ t) z8 E/ j* `1 T$ c
另外一种与之对应的模式是基于账户account-based ledger的模式,例如以太坊,这种模式需要显式的记录每个账户有多少个币,不需要显式说明币的来源。& K1 @! w2 J7 {+ z: M  T/ T# q4 U
具体区块信息例子:$ n# v2 \0 B5 f7 J1 g" n" B
图片来源于视频截图
) {7 ~3 u9 D, v2 C" }; B
: x) j4 D. r. S+ s; X挖矿概率分析:8 [2 X/ }" J  \0 ~, M
挖矿就是不断地尝试nonce,来求解puzzle。每一次尝试可以看作是一次Bernoulli trial(a random experiment with binary outcome),eg:抛硬币。如果做了很多的Bernoulli trial,每个实验都是随机的,那么这些Bernoulli trial就够成了一个Bernoulli process(a sequence of independent?Bernoulli trials)。Bernoulli process一个性质是无记忆性 memoryless,即做大量的实验,前面的结果对后面没有影响。?
: a( m2 q) `9 W- |2 @9 n1 ^6 I9 \对于挖矿来说,每次尝试nonce,成功的可能性很小,需要尝试大量的nonce才能符合要求,这种情况下,Bernoulli process可以用Poisson process来近似。实验的次数很多,每次成功的概率很小。( t) b1 @: P  f/ v( x: O& A9 Q
出块时间服从指数分布 exponential distribution。整个系统平均出块时间为10min,是比特币协议设计的定期调整挖矿难度,使得平均出块时间维持在10min左右。具体到每一个矿工,他能够挖到下一个区块的时间,取决于矿工的算力占系统总算力的百分比。指数分布也是无记忆的,也叫作progess free,是挖矿公平性的保证。2 B3 m9 {- S$ t
比特币总量分析:
3 Z; P3 S4 X) V+ ]- u出块奖励每隔4年要减半,这样产生出来的比特币数量就构成了几何序列 geometric series。
$ o8 ?$ w7 B1 ]% s: j. o" D9 q21w50+21w25+21w12.5+… = 21w50*(1+1/2+1/4+…)=2100w。2100w就是比特币系统中所有比特币的总量,包括已产生的和将要产生的。( E# u$ d" |6 K! Z
比特币求解puzzle的过程, 除了比拼算力,没有其他的实际意义。比特币越来越难被挖到,是因为出块奖励被人为减少了,比特币的稀缺性是人为造成的。虽然挖矿求puzzle本身是没有实际意义,但是挖矿过程对维护比特币系统安全性是很重要的,Bitcoin is secured by mining。挖矿提供了一种凭借算力投票的有效手段,只要大部分算力掌握在诚实的人的手里,系统的安全性就能够得到保证。
* _$ r- M; U$ B$ l8 x7 w**2 K6 x. r+ R8 \" p$ @$ F4 d
比特币安全性分析:**
! T. G6 Y3 ]+ D+ e. y* `前提假设大部分算力掌握在诚实的人的手里。挖矿给出的只是概率上的保证,只能说有比较大的概率下一个区块是由一个诚实的矿工发布的,但是不能保证记账权不会落在有恶意的人手里。如果有恶意的节点获得记账权,他可能会做的事:& W, w; z9 p9 y/ [5 ?
1.伪造一笔不合法交易,比如把别人账上的钱转到自己的账户上,但是由于自己不知道别人的私钥,所以不合法,验证不通过。那么其他诚实节点不会认同该区块,因为包含不合法交易,所以还会接着上一个区块去扩展,那么根据最长合法链,该区块不会获得block reward,而且浪费大量电力,人力。) {( [% o, Y, {9 r, F6 s8 w

3 w0 T* o  r  N6 `2.通过forking attack想把花出去的钱再次花出去,比如M转账给A,已经写到区块链中,那么现在M获得记账权,又发布另一个交易,把这个钱转回给自己。新的区块不能写在上次转账的区块后面,因为double spending很明显,只能写在上次转账的前一个区块后面,即forking attack。区块插入的位置是在设计区块的时候就决定的,这种情况下攻击难度很大,有恶意节点获得一次记账权是不够的,还需要不断地获得记账权。防范这种攻击就需要多等几个区块确认 confirmation,缺省情况下需要6个confirmation,这个时候认为前面的交易不可篡改,等待时间大概是一个小时左右。
: M3 _' ~, S# T* n$ e- i" s. L6 A* J- e7 G  [. _5 W, e7 ]* u
3.恶意节点获得记账权,故意不写合法的交易,但是合法的交易可以被写到下一个区块里,总会有诚实的节点写合法交易。正常情况下也会出现合法交易没有被写到区块中,因为可能某段时间交易数目太多,比特币协议中规定每个区块大小是有限制的,区块大小不能超过1M字节,所以如果交易太多那么有些交易只能等到下一区块发布。# A3 ]. l: w2 U" Y' o7 ?
4.selfish mining。正常情况下如果挖到区块会及时发布,以免别人挖到后自己的区块无效,作废了。但是在selfish mining中,挖到区块先不发布,隐藏一条链,等待超过最长合法链时发布。" J4 ?+ n) ]& C7 I. q7 k. x
目的:1)forking attack的一种手段,但是恶意节点需要超过51%的算力,难以实现。2 Y9 j9 u1 ^- i6 H& a
2)就是为了赚取正常的出块奖励,挖到第一时间不发布,那么其他人还会接着上一个区块挖,自己延着已挖到区块的挖,减少该区块的竞争。如果自己已经挖到第二个区块,当其他人宣称挖到第一个区块之后,自己把手里的两个一起发布,成为最长合法链。这种做法风险大,要以为别人挖出第一个区块时,自己能够挖出第二个,否则当别人挖出第一个发布时,自己手里只有一个,这时候是等长链,只能去竞争。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

小饱1 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    36