【2】隔离见证

见证:在比特币里指的是对交易合法性的验证,用于证明自己拥有某些交易的输出的见证数据。
 
隔离:就是把见证的数据从交易信息里抽离出来,单独存放。
 
 
 
隔离见证解决的问题
 
目前比特币可扩展性问题主要源于区块容量不足,当前区块的硬编码限制为1MB,这并不足以承担用户每分钟尝试发送的数百笔交易。因此,很多用户必须等待,直到交易得到确认,这个等待时间可能是几个小时,也可能是几天。 随着网络规模的扩大,交易强度也随之增加,但区块容量限制则保持不变,就意味着问题会不断恶化。
 
隔离见证解决方案由两部分组成:
1、可以立即将区块容量限制增加到4MB。(4MB是绝对最大值,实际区块容量取决于网络条件,SegWit激活后,专家预测区块容量将在2MB - 2.1MB的范围内)
2、解决交易的可扩展性,将大量交易移出区块链使用雷电网络进行快速处理,预计会大大增加区块容量
 
 

segwit的优点

  • 增加块可以执行的事务数。
  • 降低交易费用。
  • 减少每笔交易的规模。
  • 现在可以更快地确认交易,因为等待时间将减少。
  • 有助于比特币的可扩展性。
  • 由于每个区块的交易数量将增加,因此可能会增加矿工可能收取的总费用。
  • 消除交易延展性。
  • 有助于激活雷电协议。
 

二、交易地址类型

地址是使用Base58check格式化的20字节哈希值,去生成P2PKH或P2SH比特币地址。目前最常用的方式是用户交换支付信息。
普通的比特币交易地址有两种类型:
  • P2PKH(Pay-to-Public-Key-Hash):支付给公钥哈希。是最常用的模板,它被中本聪定义,允许简单的支付给一个单一的公钥。
  • P2SH(Pay-to-Script-Hash):支付到脚本,这是多重签名交易输出。在BIP16定义,它允许付款到任意复杂的脚本。
隔离见证为比特币建立了两种新的交易地址:
  • P2WPKH(Pay-to-Witness-Public-Key-Hash):支付到隔离见证公钥哈希,类似P2PKH,在BIP141新定义的。它嵌入在P2SH脚本中,所以它可以被不知道segwit的钱包使用。
  • P2WSH(Pay-to-Witness-Script-Hash):支付到多重签名隔离见证脚本哈希,类似P2SH,是BIP141定义的另一个新的脚本格式。它可以嵌入到P2SH脚本和地址中,使得任何钱包都可以进行与segwit兼容的支付。
隔离见证不会在整个网络中同时实施,为了新老客户可以共存,钱包开发人员将应独立升级钱包软件以添加隔离见证功能。都升级为segwit的钱包后,使用P2WPKH和P2WSH付款类型,传统的钱包使用P2PKH和P2SH付款类型。两种形式的见证脚本P2WPKH和P2WSH都可以嵌入到P2SH地址中,是以“3”开始的地址。P2PKH是以“1”开头的地址。
 
var bitcoin = require('bitcoinjs-lib');
var bip39 = require("bip39")
var bip32 = require("bip32")

const myNetwork = bitcoin.networks.bitcoin // 比特币正式网络

const mnemonic = 'eternal list thank chaos trick paper sniff ridge make govern invest abandon'
// const mnemonic = bip39.generateMnemonic()
const seed = bip39.mnemonicToSeed(mnemonic, "lixu1234qwer")
const root = bip32.fromSeed(seed, myNetwork)

for(var i = 0; i < 3; i++) {
    const path = "m/44'/0'/0'/0/"+i
    console.log("路径:", path)
    const keyPair = root.derivePath(path)

    const privateKey = keyPair.toWIF()
    console.log("私钥:", privateKey)

    const publicKey = keyPair.publicKey.toString("hex")
    console.log("公钥:", publicKey)

    let address = getAddress(keyPair, myNetwork)
    console.log("普通地址:", address)
    let segWitAddress = getSegWitAddress(keyPair, myNetwork)
    console.log("隔离见证:", segWitAddress, "\n")
}

function getAddress(keyPair, network) {
    const { address } = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey , network:network})
    return address
}

function getSegWitAddress(keyPair,myNetwork) {
    const { address } = bitcoin.payments.p2sh({
        redeem: bitcoin.payments.p2wpkh({ pubkey: keyPair.publicKey, network: myNetwork}),
        network: myNetwork
    })
    return address
}

  

输出
 

 

 

 
如需要了解更多相关问题,可以添加Hilamg账号:88888 进行沟通交流哦~
 
 
 
 
 
 
 
 
 
posted @ 2020-04-23 23:15  筱小Q  阅读(61)  评论(0编辑  收藏  举报