本文最后更新于2020年01月01日;如遇问题,请留言及时通知站长。

在 xue.cn 上看完了《自学是门手艺》,继续打卡 比特币极速入门指南

比特币极速入门指南
李大狗 著
发布:2019年10月
项目主页:https://bitcoin.doge.university

blockchain.jpg

基于 JupyterLab 的比特币极速入门指南
—— 进入区块链世界的绝佳入口

Github 仓库地址:https://github.com/leeduckgo/bitcoin_elementary_course_based_on_jupyterlab
项目主页:https://bitcoin.doge.university

比特币将传统的「分布式系统」往前推进一步,实现了「节点可自由进出」的分布式系统,系统的目的是维护一个「历史数据不可篡改的数据库」。然后,这个不可篡改的数据库用在存储账簿上,于是就成为了一家有「存储」和「转账」业务的「世界银行」。

传统的系统里,我和陌生人交易需要第三方(国家、机构)背书。而在这个系统里,背书的是系统本身的规则。

哈希(Hash): 指将一串任意长度的数据通过「哈希函数」(Hash Function)转换出的「固定长度的字符串」,等同于这串数据的「唯一签名」。
通过原始数据可以校验 hash ,也即可以判断签名真实性;但不能通过 hash 还原数据,也即是「不可逆」的。

ECDSA:Elliptic Curve Digital Signature Algorithm or ECDSA is a cryptographic algorithm used by Bitcoin to ensure that funds can only be spent by their rightful owners.
椭圆曲线数字签名算法(ECDSA)是一种比特币使用的密码学算法,该算法可确保资产只能被它们合法的拥有者所使用。

签名(Signature): 一个可以证明「签名行为」发生过的数字/哈希。这个数字来源于一串哈希和私钥的数学运算。和公私钥不同,签名不是定长的,一般长度为 73、72 或 71 个字节。

Secp256k1(https://en.bitcoin.it/wiki/Secp256k1)是比特币所使用的椭圆曲线的参数。所以,如果在一篇文章中提到 Secp256k1 签名算法,则可以理解为「使用了 Secp256k1 参数的 ECDSA 算法」。

私钥的本质: 私钥的本质是一个数字,这个数字用 16 进制表示的话,长度是 64;转换为字节,是 32 字节。
公钥的本质: 用私钥生成Secp256k1曲线上的一个点,将 x 与 y 拼接起来,再在开头加上 <<04>> 后得到一个数字,这个数字就是公钥。用 16进制表示的话,长度是 130;转换为字节,是 65 字节。

通过私钥我们可以生成公钥,通过公钥我们可以生成地址,但这两个过程均是不可逆的。

比特币的交易有 P2PKH、P2PK、P2SH、P2WPKH 四种类型。

P2PKH: 面向公钥哈希支付,交易需要发送人(sender)提供来自私钥的有效签名与公钥,交易输出脚本(Transaction Output Script)会使用签名和公钥来验证签名是否与公钥哈希匹配。如果匹配,则这笔钱会被支付出去。

实际上,区块链系统中有「两条链」。一个个区块头尾相连形成的链是显式的,也即使「Block Chain」;另一条是由「Output」组成的链,这些链的起始是「币基交易(Coinbase Transaction)」,终点则是 UTXO。

双重支付: 一个 UTXO,小猪先支付给小兔,这个「交易A」记载了「账本A」上;然后,小猪来到了小狗处,小狗拿着的「账本B」不包含「交易A」,所以小猪又顺利支付。
解决双重支付的方法是,收款人能在网络上找到这么一个账本(数据库),这个账本中所记载的所有交易的历史都是不可篡改的。那么,收款人自然能检查这笔 UTXO 是否被使用过了。

时间戳机制的逻辑是这样的:包含时间戳的数据进行哈希运算得到哈希值 -> 不可能在哈希值不变的情况下篡改时间戳 -> 事件必然在时间戳之前发生。

创世区块是一条区块链的第一个区块,现在的比特币版本将其标记为第0块(Block Zero)。

假设有两个人玩公平的抛硬币赌输赢的游戏,规则是:
赌注大小恒定
直至一方输光游戏才能结束
请问,最终决定输赢的是什么(单选)?
A.手气 B.谁先抛硬币 C.抛硬币次数 D.总游戏时长 E.以上皆是 F.以上皆不是