基本概念
# 1. Base58
Base58 是用于比特币(Bitcoin)中使用的一种独特的编码方式,主要用于产生 Bitcoin 的钱包地址。相比 Base64,Base58 不使用数字 "0",字母大写 "O",字母大写 "I",和字母小写 "l",以及 "+" 和 "/" 符号。
# 2. 哈希碰撞
const calculate = (d, n) => {
const exponent = (-n * (n - 1)) / (2 * d)
return 1 - Math.E ** exponent
}
2
3
4
# 3. 数字签名
数字签名的三个作用:防伪造,防篡改,防抵赖。
比特币采用的 ECDSA 签名算法需要一个私钥和公钥组成的秘钥对:私钥本质上就是一个 的随机数,公钥是由私钥根据 ECDSA 算法推算出来的,通过私钥可以很容易推算出公钥,所以不必保存公钥,但是,通过公钥无法反推私钥,只能暴力破解。
# 4. 公私钥与地址
比特币的公钥是根据私钥由 ECDSA 算法推算出来的,公钥有压缩和非压缩两种表示方法,可互相转换。比特币的地址是公钥哈希的编码,并不是公钥本身,通过公钥可推导出地址。通过地址不可推导出公钥,通过公钥不可推导出私钥。
# 5. 比特币支付
比特币支付的本质是由程序触发的数字资产转移。比特币的支付脚本就是对输入的两个数据视作签名和公钥,然后先验证公钥哈希是否与地址相同,再根据公钥验证签名,这种标准脚本称之为 P2PKH(Pay to Public Key Hash)脚本。
由此催生出了智能合约:当一个预先编好的条件被触发时,智能合约可以自动执行相应的程序,自动完成数字资产的转移。保险、贷款等金融活动在将来都可以以智能合约的形式执行。智能合约以程序来替代传统的纸质文件条款,并由计算机强制执行,将具有更高的更低的信任成本和运营成本。
多重签名可以实现 N 个人持有私钥,其中 M 个人同意即可花费资金的功能。多重签名降低了单个私钥丢失的风险。
# 6. UTXO
比特币区块链使用 UTXO 模型,它没有账户这个概念。重建整个地址-余额数据库需要扫描整个区块链,并按每个交易依次更新记录,即可得到当前状态。
# 7. Merkle Tree
梅克尔树是一种二叉树,能快速检查和归纳大量数据,可用于验证区块中交易记录的完整性,保证所有交易的不可篡改。
Merkle Root 为 Merkle Tree 顶点,存储在区块头中。
# 8. Segwit 地址
Segwit 地址又称隔离见证地址。比特币延展性攻击的原因是 ECDSA 签名总是有两个有效签名,且可以相互计算。
要解决延展性攻击的问题,有两个办法,一是对交易签名进行归一化(Normalize)。因为 ECDSA 签名后总有两个有效的签名 (r, s) 和 (r, -s mod N),那只接受数值较小的那个签名,为此比特币引入了一个 SCRIPT_VERIFY_LOW_S 标志仅接受较小值的签名。
另一个办法是把签名数据移到交易之外,这样交易本身的哈希就不会变化。不含签名的交易计算出的哈希称为 wtxid,为此引入了一种新的隔离见证地址。
# 9. 分叉
伪·软分叉(不分叉):旧节点接受新区块,新节点也接受旧区块。
真·软分叉:旧节点接受新区块,新节点不接受旧区块。
- 其实没分叉:新节点算力超过 50%。
- 确实分叉了:新节点算力不到 50%。
硬分叉:旧节点不接受新区块。
# 10. 隔离见证
比特币的格式里,允许用脚本来替换签名。签名大概占了交易大小的 2/3 空间(约 150 字节)。
隔离见证区块:每笔交易都被分成了两部分:交易和见证(签名)。交易部分只有 100 字节左右,于是一个 1MB 的区块里面能放 10000 笔交易(原来是 4000 笔)。所有的见证部分,大约 1.5MB - 2MB,都被扔到了后面。
特点:
- 是软分叉甚至不分叉。
- 理论上来讲可能提高 2-3 倍的交易量。
- 支持闪电网络,可以将一部分交易挪到链下进行,减轻主链的负担。
- 会降低比特币的安全性。
# 11. HD 钱包
HD 钱包采用分层确定性算法通过根扩展私钥计算所有层级的所有子扩展私钥,继而得到扩展公钥和地址。
可以通过普通衍生和硬化衍生两种方式计算扩展子私钥,后者更安全,但对应的扩展公钥无法计算硬化衍生的子扩展公钥。
通过扩展公钥可以在没有扩展私钥的前提下计算所有普通子扩展公钥,此特性可实现观察钱包。
HD 钱包通过 Bloom Filter 可以高效监控链上的所有地址,并根据是否是本地管理的地址决定如何计算钱包余额。
# 12. 助记词
BIP-39 规范通过使用助记词 + 口令来生成 HD 钱包的种子,用户只需记忆助记词和口令即可随时恢复 HD 钱包。生成助记词的过程是计算机随机产生的,用户只要记住这些助记词,就可以根据助记词推算出 HD 钱包的种子。
助记词的意义就是作为私钥的备份。
# 13. 以太坊
以太坊采用账户余额模型,通常情况下一个以太坊地址已够用。如果要生成多个地址,可继续派生 m/44'/60'/0'/0/1、m/44'/60'/0'/0/2 等。
以太坊的私钥和公钥采用和比特币一样的 ECDSA 算法和 secp256k1 曲线,并且可以复用比特币的 HD 钱包助记词。
比特币每隔 2015 个区块调整挖矿难度。以太坊每个区块都会调整挖矿难度。
比特币设计时本来打算每 2016 个区块调整一次难度,也就是两周一次,但是由于第一版代码的一个 bug,实际调整周期是 2015 个区块。
地址生成。
# 14. 智能合约
所谓智能合约,就是一种运行在区块链上的程序(用脚本更形象点)。以太坊通过 EVM 虚拟机执行智能合约代码。
合约被部署后将自动获得一个地址,并可像外部账户一样存取 Ether,还可以存储状态数据。只能被动地被外部账户调用,但在执行时可以调用其他合约的公共函数。
# 15. 术语
手续费 = GasUsed * GasPrice
GasUsed:Gas 实际消耗量。
- 区块:所有交易消耗的 Gas 总量。
- 交易:实际消耗的 Gas。一笔普通转账交易固定消耗 21000 Gas,也是最小 Gas 消耗量。
GasPrice:Gas 消耗单价,用户交易前设置,矿工可根据 GasPrice 选择是否打包。
GasLimit:Gas 可消耗上限。
- 区块:所有交易 Gas 消耗上限,防止无法停止(死循环)的合约来阻塞网络。每个区块的矿工可调整区块 GasLimit,任意加减 1/2024(0.0976%)。
- 交易:用户设置交易可消耗的 Gas 上限。如果实际 Gas 消耗超出用户设置的 GasLimit,那么该交易失败,消耗的 Gas 不会返还(消耗了算力)。如果实际 Gas 消耗小于用户设置的 GasLimit,那么超出的 Gas 会返还用户。
Nonce:随机数。
- 区块:工作量证明,也就是猜出的一个正确答案,代表挖矿成功。
- 账户:防止多重交易(双花),交易自增长(消息调用不会增长)。如果用户自定义交易 Nonce 大于账户 Nonce + 1,那么交易会失败。如果一个区块上用户有两个交易的 Nonce 相同(自增长 Nonce),矿工可选择一笔交易打包,另一笔交易丢弃。矿工当然会选 GasPrice 高的那笔哟,这样可以在上一笔交易打包前,发出另一笔 Nonce 一样,但 GasPrice 较高的交易,来取消上一笔交易(看手速与运气的时候了)。
代币标准:如果同一个集合的两个物品具有不同的特征,那么这两个物品是非同质的,而同质是指某个部分或数量可以被另一个同等部分或数量所代替。
- ERC20:同质代币(BNB 等),可置换、可细分。
- ERC721:非同质代币(CryptoKitties 等),不可置换、不可细分(Token 最小单位 1)。