区块链学习【一】

定义

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块。

它即是下一代的价值互联网,也是世界上最慢的数据库。

区块链想解决的问题

区块链主要想解决的是去中心化的信任问题。在中心化系统中,大家都可以信任一个信誉良好的大公司或政府,通过他们来确保交易的合法性。在区块链中则是基于大部分人都是好人这个假设来设计的。这些占大多数的好人就充当了原来的中心机构为区块链网络里的行为负责。有点像少数服从多数。

前置知识

区块链主要用到一个hash指针和一个密码学里的非对称加密

hash指针和普通指针不同的地方在于不仅保存位置,还可检验是否被修改。

因为链表每个节点都有一个指向前面节点的hash指针。除了最后一个节点任意节点被更改都会导致hash值对不上导致链表断掉。
除非你能找到一个hash 碰撞。但hash函数的性质就是collision resistance。所以说要篡改几乎是不可能的。

hash指针的另外一种组织形式就是Merkle Tree)。这在bitcoin主要用于证明交易是否被加入到区块链中。加到区块链中的交易才是可能是合法的,还要最长的链,这个之后解释。

数字交易中的一些问题

一个交易要是合法的,需要满足以下几个条件

  • 经过合法用户同意【需要有用户的签名】
  • 币的来源是合法的,不能凭空产生【防止双花攻击double spend

第一个问题很好解决。只要用用户的私钥对交易数字签名。
第二个问题就有点麻烦。我第一反应是维护个资金流水反正是hash串起来的,无法篡改。实际bitcoin里的实现方式和我想得有些差异。

bitcoin是通过交易里指明资金来源的交易的哪个输出。
比如a的前来自交易T1,那么交易T1里的输出便会有a公钥的hash值,这样别人想要盗用这笔钱就不行了,因为和T1输出的hash对不上。

下面举个bitcoin脚本的例子,好理解点。

bitcoin 脚本是是基于栈的语言。不是图灵完备的。

P2PKH(Pay-to-Public-Key-Hash) 是bitcoin的一种支付方式

PKH,即公钥哈希值。比特币网络上的大多数交易都是P2PKH交易,此类交易都含有一个锁定脚本(输出),该脚本由公钥哈希实现阻止输出功能,公钥哈希即为广为人知的比特币地址。由P2PKH脚本锁定的输出可以通过键入公钥和由相应私钥创设的数字签名得以解锁。

P2PKH的举例

在一笔交易中,Bob给Alice支付了0.15BTC。

由于在比特币中并没有账户的概念,这一笔交易的输出并没有写上Alice的名字,也没有写上Alice的公钥,而是写上了Alice公钥的哈希值。这样子,进一步保证了用户的隐私。Alice想要花费这0.15个BTC,她应该如何证明自己拥有这个UTXO,并且,其他人无法假冒Alice来花费这个UTXO呢?

答案是比特币的交易创建的输出其实并非一个简单的公钥地址,而是一个脚本。在Bob给Alice支付0.15个BTC的这个交易中,Bob创建的输出脚本类似:

OP_DUP 
OP_HASH160 
<Alice Public Key Hash> 
OP_EQUAL OP_CHECKSIG

这个脚本的意思是,谁能够提供一个签名和一个公钥,让这个脚本运行通过,谁就能花费这笔交易的0.15个BTC。由于创建签名只能使用Alice的私钥,非Alice的私钥创建的签名将无法通过这个脚本的验证,所以,其他人无法假冒Alice来花费这笔交易。

锁定脚本的解锁脚本是:

将两个脚本结合起来可以形成如下有效组合脚本:

<Alice Signature>
<Alice Public Key> 
OP_DUP 
OP_HASH160
<AlicePublic Key Hash> 
OP_EQUAL 
OP_CHECKSIG

只有当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真(Ture)。即只有当解锁脚本得到了Alice的有效签名,交易执行结果才会被通过(结果为真),该有效签名是从与公钥哈希相匹配的Alice的私钥中所获取的。

具体如下
在这里插入图片描述


正常来讲要追溯到最开始才可以100%确定资金来源合法。为了效率bitcoin里全节点维护了一个叫UTXO的数据结构,记录了未花出去的节点,有点像个中间状态的快照。

恶意节点的问题

前面说bitcoin 假设大部分节点是好的。其实不对,准确来讲是假设大部分算力无恶意的。如果是以大部分节点为标准。那么恶意节点完全可以创造大量节点(女巫攻击)。而算力想要突然变大是很难的,无法凭空产生。所以说算力才是bitcoin里真正的黄金。这也解释了为什么写入一个区块要试出一个nonce(实际上不止nonce)使得区块hash值小于特定值,因为这就是算力证明。这样可以让算力较大的节点获得写入区块的权利的概率更高。

但这并没有解决问题,如果写入区块的节点是恶意节点。还是可以写入非法的交易。这就引出了最长合法链

如果恶意节点硬要把非法交易写入区块链。那么大部分好的算力不会承认这个节点。会继续沿着之前的节点挖。由于好节点的算力更大,最终好节点的链会更长,最终恶意节点写入的区块会被回滚。同时这也就要求了出块时间不能太小,否者会有多条链竞争,好节点的算力会被分散。

当然回滚这个特性也能被恶意节点利用。如果A给B了钱。得到货物后且卖家确认交易写到区块链里后,又把交易回滚了。就相当于既得到了货物又把钱收回来了。

这就引出了six confirmation可以等区块链长点再发货,这样回滚的概率大大减小了。另外还有zero confirmation。因为bitcoin是默认接受先听到的交易,所以大部分节点还是会扩展A给B钱的区块。

另外还有一个攻击就是selfish mining。就是挖到了区块不发布。这样只有你一个人知道这个区块,其他人的算力就浪费在挖无用的节点上了。

关于挖矿

挖矿的概率问题

挖矿最重要的一点是无记忆性。因为这样不会导致穷者愈穷,富者愈富。每次挖矿概率都是一样的。都是站在同一起跑线(当然算力大的还是占优势)。由于hash函数puzzle friendly。无法预测hash函数输出。挖矿都是bernoulli process。当趋于无穷时满足Poisson process 都满足无记忆性。

伯努利分布:0-1分布;伯努利分布是二项分布在N=1时的特例;随机变量为取值为0或者1。
二项分布:N次重复且独立的伯努利实验,随机变量为在N次实验中出现某种情况(概率为p)的次数K。
泊松分布:二项分布的极限形式(N趋于无穷大,P趋于0);描述在一段给定时间t内,事件发生K次的概率。将时间段分割成很多个小的时间段,在不同的小时间段里,事件可发生可不发生(概率很小),事件的发生与否相互独立,且事件发生的概率与该小时间段的长度成正比;参数lambda表示一个时间段内时间平均发生的次数。
指数分布:描述两次事件发生间隔的概率;由泊松分布可以推导出指数分布,因为在事件发生的间隔t内没有事件发生,意味着泊松分布的随机变量K取值为0,事件在时间 t 之内发生的概率 P(T<t) = 1- P(T>t) = 1- P(K=0) = 1- e^(-λt)
指数分布常常用来描述电器寿命;指数分布和几何分布一样具有无记忆性

矿池

矿池有利于稳定收入,因为挖的人多了。

但是也涉及到如何分红的问题。矿主会给较大的target,矿工算出的hash小于target 给矿主作为工作证明。

矿工能不能藏着区块自己挖呢?实际上是不能的。因为任务是矿主分配的,区块头写得是矿主信息。无论谁发布都是矿主得钱。除非是其他矿池派来捣乱的。

参考

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇

)">
下一篇>>