一、比特币是什么,有哪些特点?
一种P2P(点对点)形式的虚拟货币。去中心化的记账系统;
去中心化:任意节点的权利和义务都是均等的,系统中的数据块由整个系统中具有维护功能的节点来共同维护、共同管理;
开放透明性:系统是开放的,除了交易各方的私有信息被加密外,区块链的数据对所有 人公开,任何人都可以通过公开的接口查询区块链数据和开发相关应用,因此整个系统 信息高度透明。
自制性:人为不可干预,决定得超过一半的人去做;区块链采用基于协商一致的规范和 协议(比如一套公开透明的算法)使得整个系统中的所有节点能够在去信任的环境自由 安全的交换数据,使得对“人”的信任改成了对机器的信任,任何人为的干预不起作用。
信息不可篡改特性:一旦信息经过验证并添加至区块链,就会永久的存储起来,除非能 够同时控制住系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,因此 区块链的数据稳定性和可靠性极高。
匿名性:由于节点之间的交换遵循固定的算法,其数据交互是无需信任的(区块链中的 程序规则会自行判断活动是否有效),因此交易对手无须通过公开身份的方式让对方自 己产生信任,对信用的累积非常有帮助。
可溯源性:因为公开透明和不可篡改的特性,所以每一笔交易信息都可以追溯其来源!
二、比特币原理
数据存储在网络节点里,比如每一台电脑里;那么问题来了,数据在每一台电脑里,已 谁的为准,数据被篡改了怎么办;
1.数据的验证
假如说如下数据:
这些数据分别存在王二、张三、李四、赵五的电脑里。可能会有人篡改数据,比如说张三把余额改为300了,如何验证张三的数据为假的呢。
a.可以一一核对,就是把王二、张三、李四、赵五的数据一条一条核对一遍,就会发现张三电脑里的张三这条数据与其他人电脑里的数据不一样,但这样做效率太低(这只有四条数据,如果有一百万条数据,效率就太低了)
b.介绍第二种之前先了解一下Hash函数(类似于常用的MD5加密)
哈希函数:Hash(原始信息) = 摘要信息
哈希函数的特点:
①同样的原始信息用同一个哈希函数总能得到相同的摘要信息
②原始信息任何微小的改变都会得到不同的摘要信息
③从摘要信息无法逆推算出原始信息
首先会对张三的数据进行Hash加密,假设 Hash(数据) 得到4564asdasdasd6ABA;
加密李四、王二、赵五的数据得到 789789attdghjfg7A,比对摘要信息就会发现张三的数据不对
这样的话对比摘要信息就会比对比原始数据信息高效的多,进一步提高效率,
区块:序号+时间戳+Hash值+交易记录
假设一个区块的Hash值为789789attdghjfg7A;比如又产生了一些交易,形成新区快的时候符合 Hash(789789attdghjfg7A,新的交易数据) = 12323as4d56a4sdS,然后对比的时候对比新的摘要信息,如果新的摘要信息正确,说明前一个的账本数据也是正确的。这样的话就会形成一个链状的结构,这样的话只需要核对最后一个区块的信息,只要对比最后一个的信息正确,说明前面区块的信息都是正确的,及整个区块链的信息是正确的。这样效率就会提高。
2.所有权问题
一般的银行卡都有卡号和密码,账号和密码对的上就可以支付。而比特币的账号相当于一个地址,密码是私钥,付款是从一个地址付款到另一个地址。而且地址与私钥是一个非对称的关系,即:
Hash(Hash(fun(私钥))) = 地址
fun是一系列特定算法。
如何交易:
第一步:对交易进行Hash得到交易摘要
Hash(
‘{“付快地址”:”ahsuidhujkashduikhasidgh”,
”收款地址”:”asyduihiuqawherihiahdi”,
”金额”:”1btc”}’
) = 456as4d646a5s4d66
第二步:用私钥对摘要进行签名
Sign(‘交易摘要’,’私钥’) = 签名信息
完成两步之后就广播,告诉周围的节点,我(付款地址)给他(收款地址)付了1btc,签名为xxx...,周围的节点收到之后,先验证
如果 Verify(签名信息,付款方地址) = 交易摘要 就会写入账本,继续向周围的节点广播;否则记账失败。
签名和验证是一个可逆的过程
Sign(交易摘要,私钥) = 签名
Verify(签名,付快地址) = 交易摘要
比特币安全性只受私钥控制,而不像银行里的钱,银行可以冻结。
3.为什么记账?(挖矿)
记账:Hash打包过程,这个过程是需要消耗资源的,既然需要成本,那么节点为什么要参与记账呢?在完成记账之后是会得到比特币奖励的(这个奖励其实就是比特币发行的过程),既然有奖励大家都会去记账,那就会出现记账不一致,所以会有一个规则来限定大家记账。
规则:一段时间内只有一个人可以记账成功;
通过解决密码学难题(即工作量证明)竞争获得唯一记账权
其他节点复制(第二步的结果)记账结果
工作量证明:
Hash(上一个Hash值,交易记录集) = asdfasdasdad56161
如果只是这样的话,都可以很快的记账,为了体现记账的难度,交易记录的值必须要以n个0开头。
Hash(上一个Hash值,交易记录集,随机数) =
00000000000000000asdasda45456就是不停的跟换随机数得到以n个0开头的记录值。
交易记录集:
收集广播中还没有被记录账本的交易
交易的有效性验证
添加一笔给自己的转账的交易(挖矿奖励)
4.已谁的账本为准?(共识机制)
第一个验证正确的有优先的记账权,就可以打包区块,因此获取奖励。
如果两个节点同时完成工作量证明,使用谁的区块?
只认可累计工作量最大(最长链)的区块链
分叉:
假设有一个节点收到#3458B的广播,并且验证成功,就会形成新的区块。 以最长就会以#3459B为主链