版权声明:凡原创系列文章,均笔者的辛勤于中,如转载,请文章顶部注明来源。谢谢配合 https://blog.csdn.net/smilejiasmile/article/details/86656447
文章目录
常见区块链比特币相关算法
拜占庭将军问题 (byzantine Generals Problem)
- 背景: 拜占庭帝国派出 10 支军队,去包围进攻敌人,至少有 6 支军队同时进攻才能胜利。其中,某些将军可能是叛徒(即所谓的恶意节点)
- 目的: 找到一种共识,远程协商,获取胜利。
- 方案:
- 每个节点给除自己以外的所有节点发送消息。
- 每个节点(或将军)根据收到的所有消息来决定最终的策略。
- 缺点:每个节点都要向全网所有的节点发送大量的消息。容易造成网络的阻塞。
- 该方案有解得前提条件是: 若叛徒数为 m, 当且仅当将军总数 n > = 3m +1 。
比特币的共识机制 ----- 工作量证明 (POW)
- 证明自己(某个节点)是个好的节点
- POW
- 通过付出大量的工作代价(这里指算力消耗)来证明自己是非恶意节点
- 通过消耗大量算力计算一个难题的随机数答案(nonce),并获取记账权,打包交易并通知其他节点,并且,可以获得比特币奖励。
- 建模的条件是: 理性人都是逐利的,POW 抑制了节点的恶意动机。只在最长的区块链上面挖矿。
比特币的产生
- 比特币由挖矿产生,通过计算一个随机数 nonce
- 生成的 BTC 被记录在旷工的名下
- BTC 通过矿工的公钥的哈希值锁定
- 交易的输出被称为“未花费交易”UTXO
Unspent Transaction Output
区块链 (分布式账本系统)
- P2P 网络,每个全节点都存储了一个历史完整的“比特币银行账本”
- 新区块包含前一个区块头部的哈希值(区块的唯一标识符),建立链接关系。
- 验证,需要 6 个以上区块确认才是安全确认。
区块链 — 篡改历史交易
- 比特币是强大的算力支持的,除非旷工联合起来,不打包区块,才能搞垮比特币。这也是 ICO 使用的区块链项目不敢用比特币的原因,因为有可能随便一个矿池就可能把它搞死。目前的 ICO 项目一般用 POS 或者 DPOS 的原因。
比特币挖矿的常见术语
- 在全网中和其他节点竞争计算的过程
- 是为了证明自己是非恶意节点
- 获得的权利和义务
- 记账权, 把交易计入区块里
- 广播义务,把区块在全网广播
- 获得的奖励
- 挖矿的奖励 - 12.5 BTC (CoinBase)
- 收取交易费用 (小费)
- 比特币的浏览器网址,这里推荐
https://blockchain.info
- 区块高度,用于描述如在第几个区块高度时候,进行硬分叉,区块深度,用于验证,最新的区块深度为 1,当区块深度为 6 时,就被确认了。
- 比特币也可以做到每秒钟产生一个块,只要将 nonce 难度设置低,就可以了,目前是十分钟产一个块,已经有可能产生分叉了,故若是 1 秒钟,将会频繁分叉,故比特币也是想避免频繁分叉,才导致十分钟出一个块。比如 eos 的拜占庭 + dpos 就比较好的解决了这个问题。
比特币密码学相关知识
计量存储单位
加密方式
- 对称加密
- 使用相同的秘钥对原文进行加解密,秘钥唯一。
- 非对称加密
- 两把秘钥,公钥和私钥,公钥由私钥推导出来的。公钥用于加密(一般用别人的公钥加密,故只有别人私钥才能解密),私钥用于解密。也可以用私钥用来签名。只有公钥才能验证。
- 哈希: 单项映射计算,不可逆,碰撞率小,使用场景,验证文件完整性,服务器中保存用户的密码,数字签名。
- 数字签名 (如 PGP)
- 验证公钥的可靠性
比特币的交易
- UTXO (Unspent TrannsXtion Output) 用比特币拥有者的公钥锁定(加密)的数字。即用别人的公钥的哈希值和这个 btc 的数字放在一起,生成一个 UTXO。==> 这些都是比特币钱包做的事情,这个也称锁定脚本。
- UTXO == 比特币
- 比特币系统里面没有比特币,只有 UTXO (数字 + 锁定的脚本(就是别人的公钥的哈希,唯一的变量)),比特币的地址是由公钥的哈希值做一些哈希操作,如sha256, CRC 等生成的。由比特币地址可以反推出公钥的哈希的。
- 比特币系统是没有账户,只有 UTXO (公钥锁定)
- 比特币系统里是没有账户余额,只有 UTXO (账号余额知识比特币钱包的概念)
- UTXO 存在全节点的数据库里。
- 转账将消耗掉属于你自己的 UTXO, 同时生成性的 UTXO, 并用接受者的公钥锁定。
交易的结构
- ``https://blockchain.info/
- 交易的输出 (UTXO)
- 锁定的比特币数量
- 锁定脚本 ( 用 接收者的公钥哈希)
- 交易的输入 ( UTXO + 解锁脚本)
- 解锁脚本 (签名,发送者的公钥)
交易验证
- 逆波兰表达示法
- 花费交易验证