主页 > 官网安卓版下载imtoken > 比特币中使用的算法知识

比特币中使用的算法知识

官网安卓版下载imtoken 2023-01-17 12:09:32

椭圆曲线数字签名算法

椭圆曲线数字签名算法 (ECDSA) 是使用椭圆曲线模拟数字签名算法 (DSA),椭圆曲线是比特币系统的基石。

私钥

非公开,所有者需妥善保管。它通常由随机算法生成。说白了就是一个巨大的随机整数,256位32字节。 1 到 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141 之间的数字可以被认为是有效的私钥。因此,除了随机方法之外,使用特定算法从固定输入获得32字节输出的算法都可以作为获取私钥的方法。因此,就有了迷你私钥(Mini Privkey),原理很简单,比如SHA256的一个实现:

private key = SHA256()

迷你私钥是安全的 问题是因为输入集太小,很容易被构造常见组合的彩虹表暴力破解,所以通常使用系统随机生成比较好,并且没有安全风险。

公钥

公钥和私钥是对应的,私钥可以推导出唯一的公钥,但公钥不能推导出私钥。公钥有两种形式:压缩和未压缩。

比特币早期使用的是未压缩的公钥,现在大多数客户端默认使用压缩的公钥。这似乎是比特币系统中的一个类似功能的错误。早期代码写得不够仔细,openssl库的文档也不够好,导致中本聪认为必须使用未压缩的全公钥。公钥左右32字节相关,左边(X)可以推导出右边(Y)的平方值,左边(X)就够了。

这两种方法现在系统共存比特币算法详解,应该永远共存。两个公钥的第一个字节是标识位,压缩后的 33 字节,未压缩的 65 字节。 0x04开头为未压缩,0x02/0x03开头为压缩公钥,0x02/0x03的选择由右Y平方的奇偶性决定。

压缩后的形式可以减少Tx/Block的大小,每个Tx Input减少32字节。

签名

使用私钥 (Sign) 对数据进行签名将产生签名 (Signature)。通常,首先将数据生成为Hash值,然后对Hash值进行签名。一个签名由两部分组成:R+S。从签名和哈希值可以推导出一个公钥,通过验证公钥可以知道签名是否是由公钥对应的私钥签名的。

通常每个签名都会有三个长度:73、72、71,匹配验证的概率分别为25%、50%、25%。因此,每次签名后,都需要找出满足验证的签名长度,然后提供给验证者。

地址

地址是一种方便人们交换的方案,因为公钥太长(130串或66串)。地址长度为25字节,转换为base58编码后为34或35个字符。 base58是一种类似于base64的编码,但是去掉了可能造成视觉混淆的字符,并在地址末尾添加了4字节校验位,以保证当人们交换个别字符不正确时,也可以因地址验证失败而停止操作错误。

由于公钥有两种形式,一个公钥对应两个地址。两个地址可以使用相同的私钥签署交易。

从公钥生成地址的算法:

Version = 1 byte of 0 (zero); on the test network, this is 1 byte of 111
Key hash = Version concatenated with RIPEMD-160(SHA-256(public key))
Checksum = 1st 4 bytes of SHA-256(SHA-256(Key hash))
Bitcoin Address = Base58Encode(Key hash concatenated with Checksum)

下图显示了从未压缩的公钥生成地址的过程:

比特币用到的算法知识

压缩公钥生成地址时,只能取公钥的X部分。

派生关系

三向推导关系:私钥>>公钥>>两个地址。这个过程是不可逆的。如果你有私钥,你就拥有了一切,但通常为了方便,也会存储相应的公钥和地址。

交易

比特币交易(Transation,简称Tx)不是单手支付单手交付等通常意义上的交易,而是一种转账。一笔交易由 N 个输入和 M 个输出组成。一笔交易的每一个输入都是一个前向交易的输出,然后溯源,必然有一笔没有输入的交易,这样的一笔交易称为 CoinBase Tx。 CoinBase 交易是奖励矿工产生的交易,始终是区块中的第一笔交易。

比特币用到的算法知识

有一个输入输出Tx数据:

Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501
 
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

一旦某个 Tx 的第 N 个输出成为另一个 Tx 的输入,那么比特币就被花掉了。每笔交易都由一个唯一的 Hash 字符串标识,该字符串通过对交易数据进行两次 SHA256 哈希运算得到:

Tx Hash ID = SHA256(SHA256(Tx Data))

矿工费

交易费是一种激励奖励,旨在鼓励矿工将 Tx 打包到 Block 中。计算一笔交易的矿工费:

Transaction Fee = SUM(Input's amount) - SUM(Output's amount)

每次Tx的矿工费必须大于等于0,否则Tx是非法的,不会被网络接受。

数据块

数据块(Block)是Block Meta和Tx存储的地方。区块的第一个 Tx 始终是 CoinBase Tx,因此该区块的交易数量始终大于等于 1,随后是此期间网络广播的 Tx。

找到一个合适的区块是一件非常困难的事情,需要大量的数学计算才能找出来,而计算过程称为“挖矿”。第一个发现者将获得一些比特币奖励。

数据链

多个区块连接起来形成一条数据链(Block Chain)。

比特币用到的算法知识

为了引入容错和竞争机制,比特币系统允许区块链分叉,但每个节点总是倾向于选择最高、难度最高的链,称为最佳链,节点只识别上面的数据最佳连锁店。

第一个块称为创世块,高度设置为零。每个后续块添加,高度增加一。目前不允许在创世区块中使用比特币。

每个块中的 Tx 在这个块中是唯一的。一个 Tx 通常只出现在一个区块中,也可能出现在多个区块中,但只有在 Best Chain 中的某个区块中才有币存

比特币是一种加密货币,一种纯粹的数字货币,没有可见的硬币或纸币。持有比特币的人意味着:

他拥有地址的私钥,这些地址是多个交易的输出并且没有被花费

所有货币记录都作为交易存储在整个区块链数据块中比特币算法详解,没有交易,也没有货币。金钱不会凭空产生,也不会凭空消失。丢失一个地址的私钥意味着该地址上的Tx无法签名,也不能作为下一个Tx的输入,比特币就被认为永远消失了。

货币发行

由于所有交易的输入源均来自 CoinBase,所以 CoinBase 生成时,即表示货币发行。比特币采用衰减发行,产量每四年减半,前四年每个区块的coinbase奖励为50BTC,其次是25btc,12.5btc,……最后在2140年归零,此时总量达到2100万比特币的上限。

减半期,严格来说,并不是四年,而是每产生 210,000 个区块。之所以俗称四年减半,是因为比特币系统会根据全网算力自动调整难度系统,这样每两周就会产生大约2016个区块,所以大约有21万个区块四年。

函数GetBlockValue()用于计算出块奖励值:

int64 static GetBlockValue(int nHeight, int64 nFees)
{
int64 nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210000 blocks, which will occur Approximately every 4 years
nSubsidy >>= (nHeight / 210000);
return nSubsidy + nFees;
}

当达到 2100 万比特币时,将不再有 CoinBase 的奖励,矿工的唯一收入来源是交易的矿工费。这个时候每个区块的收益绝对值很低,但是这个时候比特币应该很红火,币值会很高,让矿工还是有利润的。

避免多次付款

传统货币存在多重支付(Double Spending)的问题,例如非数字时代的支票欺诈和数字时代的信用卡欺诈。在比特币系统中,每笔交易的确认都需要在全网广播并记录在区块中,才能真正得到确认。对于花费的每一笔钱,都需要检测输入的最后一笔交易的状态。数据具有时间戳和公开性,BlockChain 由巨大的计算能力保护。因此,比特币系统将货币多次支付的风险大大降低到几乎为零。通过等待多个区块确认,概率降低到零。一般6次确认后,可以认为是非常安全的。但对于可能影响您生活的大笔付款,建议等待 20 到 30 次确认。

匿名

任何人都可以轻松生成大量私钥、公钥和地址。地址本身是匿名的,通过与多个地址进行交易可以进一步提高匿名性。但是,正如媒体所宣传的那样,这种匿名性并不是某种程度的匿名性。因为比特币的交易数据是公开的,所以任何资金的流向都可以被追踪到。

不了解比特币的人对其匿名性有些担忧,比如担心它更有利于从事非法业务;了解比特币的人对其伪匿名性感到困扰。传统货币在消费中也是匿名的,有法律保障。大多数国家不允许个人在纸币上取款。

地址本身是匿名的,但您可以通过使用与地址对应的私钥签署消息来向公众证明您拥有比特币地址。

其他名词

哈希

Hash 是将一个数字映射到另一个集合的函数。不同的哈希函数映射的空间不同,生成的值在计算机上反映时的长度也不同。对于同一个哈希函数,同一个输入必然是同一个输出,但是同一个输出可能有不同的输入。这种情况称为哈希冲突。

常用的散列函数有CRC32、MD5、SHA1、SHA-256、SHA-512、RIPEMD-160等。散列函数在计算中应用广泛。 SHA-256 和 RIPEMD-160 主要用于比特币。

大脑钱包和纸钱包

前面提到的脑钱包和纸钱包并不是真正的钱包分类,只是一种生成和存储密钥的方式。脑钱包是迷你私钥的产物。大脑钱包是存放在你脑袋里的钥匙,纸钱包是印在纸上的钥匙,仅此而已。

有同学提到,用电脑文件作为输入,比如一张几MB大小的照片,通过一定的Hash运算得到私钥。该方案安全性好,可以防止盗取私钥的木马根据特征对私钥进行扫描。私钥以文本形式存储是有特点的,但是照片文件很难被检测到,即使放在云盘等第三方存储空间也是安全的。