比特币钱包开发:隔离见证剖析与编程实践

当前位置:首页 > 币圈百科 > 比特币钱包开发:隔离见证剖析与编程实践

比特币钱包开发:隔离见证剖析与编程实践

2022-12-15币圈百科355

目标

了解什么是隔离见证交易地址类型编程实践:生成隔离见证地址

你可能会疑惑,这个隔离见证对我们的比特币钱包开发有什么影响?接下来你知道的。

一、什么是隔离见证

隔离见证的英文名是SegWit,是Segregated Witness的简称。隔离见证(Isolated witness)是针对比特币提出的升级方案,旨在解决比特币面临的一系列严重问题。它是由Pieter Wuille(比特币核心开发者和Blockstream的联合创始人)在2015年12月开发的。主要由BIP-141定义。

我们可以这样理解隔离见证:

见证:在比特币中,是指交易合法性的验证,用来证明你拥有某些交易输出的见证数据。

隔离:即从交易信息中提取见证数据,单独存储。

SegWit解决的问题

seg wit是比特币核心提出的更新,是目前最流行的比特币标准客户端,被大多数企业使用。最初,这一更新旨在解决交易的可扩展性,这也是比特币软件中众所周知的弱点。虽然这种攻击载体对用户的破坏力并不是最大的,但迄今为止已经在很多攻击案例中使用,这凸显了修复这一漏洞的必要性。

目前比特币的可扩展性问题主要是块容量不足。这里的问题是,当前块的硬编码限制是1兆字节,不足以承担用户每分钟试图发送的数百个事务。因此,许多用户不得不排队等待,直到他们的交易被确认,而这个等待时间可能是几个小时,甚至几天。随着网络规模的扩大,交易强度也会增加,但块容量限制不变,意味着问题会继续恶化。

SegWit的解决方案由两部分组成:

首先,它可以立即将块容量限制提高到4兆。有一点需要注意:4 MB是绝对的最大值,实际的块容量将取决于网络条件。SegWit激活后,专家预测块容量将在2到2.1 MB的范围内。第二,为了解决交易的可扩展性,将大量交易移出区块链,并使用闪电网络进行快速处理,预计这将大大增加网络容量。

seg wit

的优点增加了一个块可以执行的事务数量。降低交易成本。减少每笔交易的规模。现在你可以更快地确认交易,因为等待时间会减少。有助于比特币的可扩展性。随着每个区块交易数量的增加,可能会增加矿商收取的总费用。消除事务扩展性。有助于启动闪电协议。

二。交易地址类型

该地址是一个20字节的哈希值,使用Base58check格式化,以生成P2PKH或P2SH比特币地址。目前最常用的方法是用户交换支付信息。

常见的比特币交易地址有两种:

P2PKH(pay-to-public-key-hash):payed 蓑衣网小编2022 to public key hash。是最常用的模板,由中本聪定义,允许对单个公钥进行简单支付。P2SH(Pay-to-Script-Hash):Pay to Script,是多重签名交易的输出。如BIP16中所定义的,它允许向任何复杂的脚本付款。

Quarantine Witness为比特币建立了两个新的交易地址:[X]P2WPKH(Pay-to-Witness-Public-Key-Hash):Pay to Quarantine Witness公钥Hash,类似于P2PKH,是BIP141中新定义的。它嵌入在P2SH脚本中,所以不了解segwit的钱包也可以使用。P2H(pay-to-witness-script-hash):pay to多签名隔离见证脚本hash,类似于P2SH,是BIP141定义的另一种新的脚本格式。它可以嵌入P2SH脚本和地址中,这样任何钱包都可以进行segwit兼容的支付。

隔离见证不会蓑衣网小编2022同时在全网实现。为了新老客户共存,钱包开发者要自主升级钱包软件,增加隔离见证功能。升级到segwit的钱包后,使用的是P2WPKH和P2WSH支付类型,而传统钱包使用的是P2PKH和P2SH支付类型。 两种形式的见证脚本P2WPKH和P2WSH都可以嵌入到P2SH地址中,是以"3"开始的地址P2PKH是以"1"开头的地址

举个例子,假设有两个人:徐丽、张三、徐丽的钱包没有升级到塞格维特,但是张三的钱包已经升级,可以处理塞格维特交易106 .徐丽和张三都可以使用正常地址交易,但是张三很可能会使用塞格维特来降低交易费用。在这种情况下,张三的钱包就需要构建一个包含一个塞格维特脚本的P2SH地址106 .徐丽的钱包认为这是一个正常的P2SH地址,并可以在没有任何塞格维特的知识的情况下付款。然后,张三的钱包可以通过隔离交易来支付这笔款项,充分利用隔离交易并降低交易费用

因此我们需要构建塞格维特地址兼容普通地址

三、编程实践:生成隔离见证地址

代码

var bitcoin=require(' bitcoinjs-lib ');var bip 39=require(' bip 39 ')var bip 32=require(' bip 32 ')const my network=bit coin。网络。bitcoinconst助记符='永恒列表感谢混沌诡计纸嗅岭让政府投资弃/const助记符=bip 39。generatemnemonic()const seed=bip 39。助记符种子(助记符,'徐丽1234 qwer ')常数根=bip 32。from seed(种子,我的网络)for(var I=0;i3;I){ const path=' m/44 '/0 '/0 '/0/' I控制台。日志('路径:'path)常量密钥对=root。derivepath(path)const私钥=密钥对。towif()控制台。日志('私钥:'私钥)const公钥=密钥对。公钥。tostring(“十六进制”)控制台。日志('公钥:'公钥)let address=get address(密钥对,myNetwork) console.log('普通地址:'address)let segWitAddress=getSegWitAddress(key pair,myNetwork) console.log('隔离见证:'segWitAddress,' \ n ')}函数getAddress(keyPair,network){ const { address }=bit coin。付款。p2pkh({ pubkey:key pair。公钥,网络:网络})返回地址}函数getSegWitAddress(keyPair,我的网络){ const { address }=bit coin。付款。p2sh({ redempt:bit coin。付款。p2wpkh({ pubkey:key:public key,network: myNetwork}),network: myNetwork })返回地址}

输出

7EBFC423-8E93-471E-B336-C2AF46969391

验证

4C5D6822-8F20-49A9-BFCC-9D3CCB933A42

C78D7E3D-CF91-4874-9C0E-5141956BAFA7

代码解析

这里只解getSegWitAddress方法的实现,其它代码解析请查看上一章"从生成助记词到扩展子地址"的内容。二进制硬币。付款。p2sh({ redempt:bit coin。付款。p 2 wpkh({ pubkey:key pair。公钥,网络:myNetwork}),网络:myNetwork })

这是将p2wpkh地址嵌套在p2sh地址中,作为它的履行字段。同时需要注意,在两种地址类型中都需要指定网络类型。上面的代码是在比特币正式网络中运行的,即指定了构建我的网络=比特币。网络。比特硬币。

版权声明:博客中的文章版权归博主所有,未经授权禁止转载,转载请联系作者取得同意并注明出处

未经授权禁止转载、改编,转载请注明出处!

比特币钱包开发:隔离见证剖析与编程实践 | 分享给朋友: