主页 > imtoken钱包分享链接在哪里 > 看完后有收获,可以付钱给作者喝咖啡

看完后有收获,可以付钱给作者喝咖啡

隔离见证地址也称为隔离见证地址。在比特币区块链上,你经常可以看到以 bc 开头的地址,例如 bc1qmy63mjadtw8nhzl69ukdepwzsyvv4yex5qlmkd,即隔离见证地址。

有几种类型的隔离见证地址。一种是以3开头的嵌套Segwit地址。从这个地址中,无法区分它是多重签名地址还是兼容Segwit的地址。优点是钱包程序不需要修改,可以直接支付到这个地址。

另一个是Native Segwit Address中国比特币罚没后应如何处理,是一个以bc开头的地址,本质上是一种新的编码方式。

让我们回顾一下以 1 开头的比特币地址是如何创建的:

根据公钥计算hash160;添加一个固定的标头并使用校验和计算 Base58 编码。

一个简单的概括是使用 Base58 编码的公钥哈希。

bc 地址使用的不是 Base58 编码,而是 Bech32 编码。它的算法是:

根据公钥计算hash160;使用 Base32 编码获得更长的代码;使用 bc 作为识别码进行编码和校验。

Bech32编码实际上由两部分组成:一部分是前缀如bc,称为HRP(Human Readable Part,用户可读部分),另一部分是特殊的Base32编码,使用字母qpzry9x8gf2tvdw0s3jn54khce6mua7l,用1连接在中间。Bech32编码公钥的代码如下:

const
    bitcoin = require('bitcoinjs-lib'),
    bech32 = require('bech32'),
    createHash = require('create-hash');
----
// 压缩的公钥:
let publicKey = '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c';
// 计算hash160:
let
    sha256 = createHash('sha256'),
    ripemd160 = createHash('ripemd160'),
    hash256 = sha256.update(Buffer.from(publicKey, 'hex')).digest(),
    hash160 = ripemd160.update(hash256).digest();
// 计算bech32编码:
let words = bech32.toWords(hash160);
// 头部添加版本号0x00:
words.unshift(0);
// 对地址编码:
let address = bech32.encode('bc', words);
console.log(address); // bc1qmy63mjadtw8nhzl69ukdepwzsyvv4yex5qlmkd

与Base58地址相比,Bech32地址的优势在于:

它不区分大小写,因为用于编码的字符表没有大写字母;有固定前缀,可任意设置,便于识别;生成的二维码更小。

它的缺点是:

与现有地址不兼容,必须升级钱包程序;1作为分隔符,但使用了字母l,容易混淆;地址较长,有 42 个字符。

那么为什么要引入隔离见证地址呢?官方称其目的是解决对比特币交易的交易延展性攻击。

可塑性攻击

什么是可塑性攻击?让我们首先回顾一下比特币的区块链如何保证交易是有效且未经修改的:

每笔交易都必须经过签名才能花费输入(UTXO);所有交易的哈希值在默克尔树中计算并存储在区块头中。

我们再来看看每笔交易的细节中国比特币罚没后应如何处理,假设有一个输入和一个输出,它看起来像:

tx = ... input#index ... signature ... output-script ...

而整个交易的hash可以直接从交易本身计算出来:

tx-hash = dhash(tx)

因为只有私钥持有者才能正确签名,所以只要签名有效,tx 本身就应该是固定的。

但问题在于 ECDSA 签名算法。ECDSA签名算法基于私钥计算得到的签名实际上是两个整数,记为(r, s),但是由于椭圆曲线的对称性,(r, -s mod N)实际上是一个有效的签名( N是椭圆曲线一)的固定参数之一,也就是说,当一笔交易被签名时,总是可以计算出两个有效签名,而这两个有效签名也可以相互计算。

黑客可以在交易发送但不在区块中的时间内修改签名,使其仍然是有效交易。请注意,黑客不能修改任何输入或输出的地址和数量,只能修改签名。但是由于签名的修改,整个交易的hash都发生了变化。如果修改后的交易先打包,这种延展性攻击可以用来攻击交易所,虽然原始交易会被丢弃,但不影响交易安全。

解决延展性攻击的方法有两种,一种是规范化交易签名。因为ECDSA签名后总是有两个有效的签名(r,s)和(r,-s mod N),所以只接受值较小的签名。出于这个原因,比特币引入了一个 SCRIPT_VERIFY_LOW_S 标志来只接受较小的值。的签名。

另一种方法是将签名数据移出交易,这样交易本身的哈希值就不会改变。为未签名交易计算的哈希称为 wtxid,并为此引入了新的 segwit 地址。

概括

以 bc 开头的隔离见证地址使用 Bech32 编码;

比特币延展性攻击的原因是ECDSA签名总是有两个可以相互计算的有效签名;

规范的 ECDSA 签名格式强制使用固定签名(例如,始终使用较小值的签名)。