比特币的历史可以追溯到2008年10月,一个名叫中本聪的神秘人物在一个密码学朋克论坛上发表了一篇比特币:一种点对点的电子现金系统的文章,这篇文章被看成是比特币的白皮书。
比特币具有以下特点:
创建了无需信任中心的货币发行机制;
发行数量由程序决定,无法随意修改;
交易账本完全公开可追溯,不可篡改;
密码学理论保证货币防伪造,防双花;
数字签名机制保证交易完整可信,不可抵赖和撤销。
区块链依靠安全的哈希算法保证所有区块数据不可更改;
交易数据依靠Merkle Hash确保无法修改,整个区块依靠Block Hash确保区块无法修改;
工作量证明机制(挖矿)保证修改区块链的难度非常巨大从而无法实现。
使用数字签名时,每个人都可以自己生成一个秘钥对,这个秘钥对包含一个私钥和一个公钥:私钥被称为Secret Key或者Private Key,私钥必须严格保密,不能泄漏给其他人;公钥被称为Public Key,可以公开给任何人:
数字签名的三个作用:防伪造,防篡改,防抵赖。 常用的数字签名算法有:RSA算法,DSA算法和ECDSA算法
如果丢失了私钥,就永远无法花费对应公钥的比特币!
要特别注意,比特币的地址并不是公钥,而是公钥的哈希,即从公钥能推导出地址,但从地址不能反推公钥,因为哈希函数是单向函数。
比特币的公钥是根据私钥由ECDSA算法推算出来的,公钥有压缩和非压缩两种表示方法,可互相转换。
比特币的地址是公钥哈希的编码,并不是公钥本身,通过公钥可推导出地址。
通过地址不可推导出公钥,通过公钥不可推导出私钥。
哈希算法输出长度(bit)输出长度(字节)
MD5128 bit16 bytes
RipeMD160160 bits20 bytes
SHA-1160 bits20 bytes
SHA-256256 bits32 bytes
SHA-512512 bits64 bytes
比特币使用的哈希算法有两种:SHA-256和RipeMD160
比特币使用两种哈希算法,一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256或者dhash。
另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。
比特币的挖矿原理就是一种工作量证明机制。
实际的难度是根据bits由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效:注意,难度值越小,说明哈希值前面的0越多,计算难度越大。
比特币网络的难度值是不断变化的,它的难度值保证大约每10分钟产生一个区块,而难度值在每2015个区块调整一次:如果区块平均生成时间小于10分钟,说明全网算力增加,难度值也会增加,如果区块平均生成时间大于10分钟,说明全网算力减少,难度值也会减少。因此,难度值随着全网算力的增减会动态调整。
比特币总量被限制为约2100万个比特币,初始挖矿奖励为每个区块50个比特币,以后每4年减半。
比特币挖矿是一种带经济激励的工作量证明机制;
工作量证明保证了修改区块链需要极高的成本,从而使得区块链的不可篡改特性得到保护;
比特币的网络安全实际上就是依靠强大的算力保障的。
比特币的支付实际上并不是直接支付到对方的地址,而是一个脚本,这个脚本的意思是:谁能够提供另外一个脚本,让这两个脚本能顺利执行通过,谁就能花掉这笔钱:
P2PKH(Pay to Public Key Hash)脚本。
使用钱包软件创建的交易都是标准的支付脚本,但是,比特币的交易本质是成功执行解锁脚本和锁定脚本,所以,可以编写各种符合条件的脚本。
智能合约:当一个预先编好的条件被触发时,智能合约可以自动执行相应的程序,自动完成数字资产的转移。保险、贷款等金融活动在将来都可以以智能合约的形式执行。智能合约以程序来替代传统的纸质文件条款,并由计算机强制执行,将具有更高的更低的信任成本和运营成本。
比特币采用脚本的方式进行可编程支付:通过执行解锁脚本确认某个UTXO的资产可以被私钥持有人转移给其他人。
以3开头的地址就是比特币的多重签名地址,但从地址本身无法得知签名所需的M/N。 大型机构的比特币通常都使用多重签名地址以保证安全。
多重签名可以实现N个人持有私钥,其中M个人同意即可花费资金的功能。
多重签名降低了单个私钥丢失的风险。
支付比特币到一个多重签名地址实际上是创建一个P2SH输出。
还没有被下一个交易花费的Output被称为UTXO:Unspent TX Output,即未花费交易输出。给定任何一个区块,计算当前所有的UXTO金额之和,等同于自创世区块到给定区块的挖矿奖励之和。
比特币区块链使用UTXO模型,它没有账户这个概念;
重建整个地址-余额数据库需要扫描整个区块链,并按每个交易依次更新记录,即可得到当前状态。
Segwit地址又称隔离见证地址。在比特币区块链上,以bc开头的地址,这种地址就是隔离见证地址。使用了Bech32编码;
比特币交易的延展性(Transaction Malleability)攻击。
在某一笔交易发出但并未落块的时间内,对签名进行修改,使之仍是一个有效的交易。注意黑客并无法修改任何输入输出的地址和金额,仅能修改签名。但由于签名的修改,使得整个交易的哈希被改变了。如果修改后的交易先被打包,虽然原始交易会被丢弃,且并不影响交易安全,但这个延展性攻击可用于攻击交易所。
要解决延展性攻击的问题,有两个办法,一是对交易签名进行归一化(Normalize)另一个办法是把签名数据移到交易之外,这样交易本身的哈希就不会变化。不含签名的交易计算出的哈希称为wtxid,为此引入了一种新的隔离见证地址。
比特币延展性攻击的原因是ECDSA签名总是有两个有效签名,且可以相互计算;
规范ECDSA签名格式可强制使用固定签名(例如总是使用较小值的签名)。
根据某种确定性算法,只需要管理一个根私钥,即可实时计算所有“子私钥”的管理方式,称为HD钱包。HD是Hierarchical Deterministic的缩写,意思是分层确定性。先确定根私钥root,然后根据索引计算每一层的子私钥:
HD钱包采用分层确定性算法通过根扩展私钥计算所有层级的所有子扩展私钥,继而得到扩展公钥和地址;
可以通过普通衍生和硬化衍生两种方式计算扩展子私钥,后者更安全,但对应的扩展公钥无法计算硬化衍生的子扩展公钥;
通过扩展公钥可以在没有扩展私钥的前提下计算所有普通子扩展公钥,此特性可实现观察钱包。
比特币的BIP-44规范定义了一种如何派生私钥的标准,它本身非常简单:m / purpose' / coin_type' / account' / change / address_index
其中,purpose总是44,coin_type在SLIP-44中定义,例如,0=BTC,2=LTC,60=ETH等。account表示用户的某个“账户”,由用户自定义索引,change=0表示外部交易,change=1表示内部交易,address_index则是真正派生的索引为0~231的地址。
实现了BIP-44规范的钱包可以管理所有币种。相同的根扩展私钥在不同钱包上派生的一组地址都是相同的。
注意:不要自己挑选助记词,原因一是随机性太差,二是缺少校验。
为了解决初始化种子的易用性问题,BIP-39规范提出了一种通过助记词来推算种子的算法
根据助记词推算种子的算法是PBKDF2,使用的哈希函数是Hmac-SHA512,其中,输入是助记词的UTF-8编码,并设置Key为mnemonic+用户口令,循环2048次,得到最终的64字节种子。
要特别注意:用户除了需要记住助记词外,还可以额外设置一个口令。HD种子的生成依赖于助记词和口令,丢失助记词或者丢失口令(如果设置了口令的话)都将导致HD钱包丢失!
HD钱包通过Bloom Filter可以高效监控链上的所有地址,并根据是否是本地管理的地址决定如何计算钱包余额。
布隆过滤器(Bloom Filter)原理是将每个元素通过若干个哈希函数映射成一个位数组的若干个点,将其置1。检索的时候,先计算给定元素对应位是否全1,如果是全1,则给定元素很可能存在,否则,元素必定不存在。