Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换

这篇具有很好参考价值的文章主要介绍了Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们已经执行了 Bitcoin SV 和 Bitcoin Core 之间的首次原子交换。 这一成就代表了比特币 SV 的重大进步,以去信任的方式促进了与其他区块链的无缝互操作性。

Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换,智能合约,区块链,智能合约,脚本语言

图片源自Gemini

在上一篇文章中,我们解释了原子交换的高级理论。 我们深入研究了使用哈希时间锁定合约(HTLC)在 BSV 和 BTC 之间进行原子交换的实际示例。 让我们将此过程分解为四个基本步骤,每个步骤都包含您可以自己运行的代码片段。

第 1 步:Alice 在 BTC 上发起交易

该过程从 Alice 开始,她选择一个随机整数 x 并使用 SHA-256 算法创建一个哈希值 (xHash)。 接下来,Alice 部署了一个 Pay-to-Witness-Script-Hash (P2WSH) 交易,其中包括她想要与 Bob 交易的 BTC 数量。

我们使用 bitcoinutils 库构建 Alice 的交易:

def main():
    # always remember to setup the network
    setup('testnet')

    # TODO: remember to adjust the values marked by "TODO" to your use case.
    alicePriv = PrivateKey('TODO')
    alicePub = alicePriv.get_public_key()
    bobPub = PublicKey('TODO')
    txid = 'TODO'  # Previous transaction ID
    vout = 2  # Previous transaction ouput index
    amount = 0.00001850   # Amount in output
    fee = 0.00000125      # Fee in new transaction
    x = 'f00cfd8df5f92d5e94d1ecbd9b427afd14e03f8a3292ca4128cd59ef7b9643bc'
    xHash = '1908c59a71781b7a44182ec39dd84a8a9e13dc31691fead8631730f5f5ab7b65'
    nBlocksLocked = '06'  # 6 blocks ~ 1 hr

    # HTLC script:
    htlc_redeem_script = Script(
        ['OP_IF',
            'OP_SHA256',
            xHash,
            'OP_EQUALVERIFY',
            bobPub.to_hex(),
            'OP_CHECKSIG',
        'OP_ELSE',
            nBlocksLocked,
            'OP_CHECKSEQUENCEVERIFY',
            'OP_DROP',
            alicePriv.get_public_key().to_hex(),
            'OP_CHECKSIG',
        'OP_ENDIF']
    )
    toAddress = P2wshAddress.from_script(htlc_redeem_script)

    # Create transaction input from tx id of utxo.
    txIn = TxInput(txid, vout)
    redeem_script1 = Script(
        ['OP_DUP', 'OP_HASH160', alicePub.to_hash160(), 'OP_EQUALVERIFY', 'OP_CHECKSIG'])

    # Create transaction output, which contains the P2WSH for the HTLC script.
    txOut = TxOutput(to_satoshis(amount - fee), toAddress.to_script_pub_key())

    # Create transaction.
    tx = Transaction([txIn], [txOut], has_segwit=True)

    # Sign transaction.
    sig1 = alicePriv.sign_segwit_input(tx, 0, redeem_script1, to_satoshis(amount))
    tx.witnesses.append(Script([sig1, alicePub.to_hex()]))

    # Print raw signed transaction ready to be broadcast.
    print("\nRaw signed transaction:\n" + tx.serialize())
    print("\nTxId:", tx.get_txid())

执行后,代码将打印原始的序列化交易,我们可以使用 Blockstream 的区块浏览器将其广播到 BTC 网络。

该 P2WSH 交易脚本由条件子句组成,这些条件子句包括需要 Bob 的公钥和秘密 x,或者 Alice 的签名和花费交易的时间延迟。

Bob 在 BTC 上进行应答

作为回应,Bob 在 BSV 区块链上部署了等效的 sCrypt 智能合约,其中包含他准备与 Alice 交换的 BSV 金额。

class HashTimeLockContract extends SmartContract {
    @prop() readonly alicePubKey: PubKey

    @prop() readonly bobPubKey: PubKey

    @prop() readonly hashX: Sha256

    @prop() readonly timeout: bigint // Can be a timestamp or block height.


    // hash lock
    @method()
    public unlock(x: ByteString, aliceSig: Sig) {
        // Check if H(x) == this.hashX
        assert(sha256(x) == this.hashX, 'Invalid secret.')

        // Verify Alices signature.
        assert(this.checkSig(aliceSig, this.alicePubKey))
    }

    // time lock
    @method()
    public cancel(bobSig: Sig) {
        assert(this.ctx.locktime >= this.timeout, 'locktime has not yet expired')

        // Verify Bobs signature.
        assert(this.checkSig(bobSig, this.bobPubKey))
    }
}

Bob 获得了 x 的哈希值,但不是 x 本身,以及 Alice 的公钥。 然后,他使用以下部署代码部署智能合约:


const alicePubKey = bsv.PublicKey.fromHex('TODO')

const bobPrivKey = bsv.PrivateKey.fromWIF('TODO')
const bobPubKey = bobPrivKey.publicKey

const amount = 100000  // TODO: amount of BSV to be locked in the contract

const xHash = toByteString(
    '1908c59a71781b7a44182ec39dd84a8a9e13dc31691fead8631730f5f5ab7b65'
)
const lockTimeMin = 1688715000 // Timestamp, after which Bob can withdraw his funds.

await CrossChainSwap.compile()

// Connect Bob signer.
const provider = new DefaultProvider(bsv.Networks.testnet)
const signer = new TestWallet(bobPrivKey, provider)

const crossChainSwap = new CrossChainSwap(
    PubKey(alicePubKey.toHex()),
    PubKey(bobPubKey.toHex()),
    xHash,
    BigInt(lockTimeMin)
)
await crossChainSwap.connect(signer)


// Contract deployment.
const deployTx = await crossChainSwap.deploy(amount)
console.log('CrossChainSwap contract deployed: ', deployTx.id)

第三步:Alice 解锁 Bob 的合约

成功部署 sCrypt 合约后,Alice 现在可以通过泄露秘密 x 来调用 Bob 合约的公共方法 unlock()。 结果,Alice 拥有了 Bob 的 BSV。

const deployedContractTXID = 'TODO'
const x = toByteString('f00cfd8df5f92d5e94d1ecbd9b427afd14e03f8a3292ca4128cd59ef7b9643bc')

// Alice unlocks contract and takes the funds.
const provider = new DefaultProvider(bsv.Networks.testnet)
const signer = new TestWallet(alicePrivKey, provider)

const tx = await signer.provider.getTransaction(deployedContractTXID)
const crossChainSwap = CrossChainSwap.fromTx(tx, 0)
await crossChainSwap.connect(signer)

const { tx: callTx, atInputIndex } =
    await crossChainSwap.methods.unlock(
        x,
        (sigResps) => findSig(sigResps, alicePubKey),
        {
            pubKeyOrAddrToSign: alicePubKey,
        } as MethodCallOptions<CrossChainSwap>
    )
console.log('CrossChainSwap "unlock" method called: ', callTx.id)

第四步:Bob 取回 Alice 的 BTC

一旦 Alice 透露了 x,Bob 就可以用它来解锁 BTC 区块链上的 P2WSH UTXO。 这个过程允许鲍勃索取爱丽丝的比特币,从而完成原子交换。

def main():
    # always remember to setup the network
    setup('testnet')

    # TODO: Set values:
    bobPriv = PrivateKey('TODO')
    bobPub = bobPriv.get_public_key()
    alicePub = PublicKey('TODO')
    txid = 'TODO'  # Previous transaction ID
    vout = 0 # Previous transaction ouput index
    amount = 0.00001725   # Amount in output
    fee = 0.00000125      # Fee in new transaction
    x = 'f00cfd8df5f92d5e94d1ecbd9b427afd14e03f8a3292ca4128cd59ef7b9643bc'
    xHash = '1908c59a71781b7a44182ec39dd84a8a9e13dc31691fead8631730f5f5ab7b65'
    nBlocksLocked = '06'  # 6 blocks ~ 1 hr
    toAddress = P2wpkhAddress.from_address('TODO')

    # HTLC Script:
    htlc_redeem_script = Script(
        ['OP_IF',
            'OP_SHA256',
            xHash,
            'OP_EQUALVERIFY',
            bobPub.to_hex(),
            'OP_CHECKSIG',
        'OP_ELSE',
            nBlocksLocked,
            'OP_CHECKSEQUENCEVERIFY',
            'OP_DROP',
            alicePub.to_hex(),
            'OP_CHECKSIG',
        'OP_ENDIF']
    )

    fromAddress = P2wshAddress.from_script(htlc_redeem_script)

    # Create transaction input from tx id of UTXO
    txin = TxInput(txid, vout)

    txOut1 = TxOutput(to_satoshis(amount - fee), toAddress.to_script_pub_key())

    tx = Transaction([txin], [txOut1], has_segwit=True)

    # NOTE: In P2WSH, the argument for OP_IF and OP_NOTIF MUST be exactly an empty vector or 0x01, or the script evaluation fails immediately.

    # Normal unlock:
    sig1 = bobPriv.sign_segwit_input(tx, 0, htlc_redeem_script, to_satoshis(amount))
    tx.witnesses.append(Script([
        sig1,
        x,
        '01',  # OP_TRUE
        htlc_redeem_script.to_hex()]))

    # print raw signed transaction ready to be broadcasted
    print("\nRaw signed transaction:\n" + tx.serialize())
    print("\nTxId:", tx.get_txid())

我们可以广播打印的原始交易并完成交换。

争议解决

在发生争议的情况下,Alice 和 Bob 都可以在一段时间后提取资金。

此功能提供了一种故障安全机制,可确保在交换不成功或有争议的情况下不会永久锁定资金。 时间限制为双方解锁各自的合同提供了足够的窗口。

在爱丽丝的例子中,我们可以修改见证人的构造:

# ...

# Create transaction input from tx id of UTXO.
txin = TxInput(txid, vout, sequence=bytes.fromhex('FFFFFFFE'))

# ...

locktime = bytes.fromhex('64A7F990') # 1688730000
tx = Transaction([txin], [txOut1], has_segwit=True, locktime=locktime)

# Withdrawal:
sig1 = alicePriv.sign_segwit_input(tx, 0, htlc_redeem_script, to_satoshis(amount))
tx.witnesses.append(Script([
    sig1,
    '', # OP_FALSE
    htlc_redeem_script.to_hex()]))

#...

传递 OP_FALSE 作为第一个输入将在 OP_ELSE 之后执行脚本,这会检查时间锁定是否已过期。

同样,在 Bob 的情况下,我们修改代码以调用 cancel 方法:


// Bob withdraws after timeout passed.
const { tx: callTx, atInputIndex } =
    await crossChainSwap.methods.cancel(
        (sigResps) => findSig(sigResps, bobPubKey),
        {
            lockTime: 1688730000,
            pubKeyOrAddrToSign: bobPubKey,
        } as MethodCallOptions<CrossChainSwap>
    )
console.log('CrossChainSwap "cancel" method called: ', callTx.id)

首次成功跨链BTC-BSV互换

我们在 BSV 和 BTC 主网之间进行了首次成功的原子交换。

  • BTC 上的初始 P2WSH 交易:af7a8c31e489c18d6fe46141cf2cbc777aeb23672679eb199bde4813d6fe41d4

  • BSV 上等效的 sCrypt 智能合约交易:8598d203e8bdd45b7025e334cdebdef06be88381dec245d95108e658e8373f9c

  • Alice 调用 unlock 方法:68c2c5a91645112df6b62a5ee6ea9e0e22f29499b88c9ccffc23f8f86ec63d09

  • 鲍勃解锁了 BTC:9c697bf8f0d2c11285cfab3a2b8a856a1c18ae048d481c7bb3f93f9ccd2dbaad

这也是一个未完成的交换示例。 爱丽丝和鲍勃都收回了他们的资金。

  • BTC: 395dde14e489208302c1d6ac3b4fc0db890c000fd79f3e836fc74043a54480ff
  • BSV: 12e701237a1f6da2b69f1d4dab2b1208d3f6003f7b45ef178c5c7d9e00c54273

本文中显示的所有代码都可以在我们的 GitHub 上找到。文章来源地址https://www.toymoban.com/news/detail-767767.html

到了这里,关于Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为三层交换机之间配置VLAN间路由

    在华为三层交换机上进行VLAN间路由的配置,主要就是创建VLAN,端口划分,三层VLAN接口地址配置,静态路由或是RIP协议配置。 静态路由配置过程: PCA:ip address:10.1.1.2/24 gw:10.1.1.1/24(VLAN2路由接口IP地址) PCB:ip address:10.1.2.2/24 gw:10.1.2.1/24(VLAN3路由接口IP地址) PCC:ip address:10.1.3.2/24 g

    2024年02月06日
    浏览(45)
  • 多个 .NET Core SDK 版本之间进行切换 global.json

    由于同一台电脑可以安装多个版本的.NET Core SDK。 当安装了许多不同版本的.NET Core SDK 之后,要如何才能使用旧版dotnet 命令,执行dotnet new 或dotnet build 之类的命令? 这部分其实并不困难,只要设定global.json 即可。 首先要查询目前电脑所有安装过的SDK 版本,首先通过 dotnet -

    2024年03月12日
    浏览(48)
  • Cisco交换机堆叠与HSRP之间的区别深入剖析

    图解 Cisco 交换机堆叠与 HSRP 之间的区别 随着Internet的日益普及,人们对网络的依赖性也越来越强。这同时对网络的稳定性提出了更高的要求,人们自然想到了基于设备的备份结构,就像在服务器中为提高数据的安全性而采用双硬盘结构一样。核心交换机是整个网络的核心和心

    2024年02月05日
    浏览(41)
  • VLAN/Trunk以及三层交换之间的关系与区别

    VLAN/Trunk以及三层交换之间的关系与区别是什么,如果能回答出下面四个问题那就说明你知道他们之前的区别,如果不知道答案的话可以参考本文哦。 1.支持VLAN的交换机一定是三层交换机吗? 2.Trunk配置了就可以VLAN间通信吗? 3.Trunk具体怎么工作的? 4.VLAN间的通信到底是怎么执行

    2024年02月07日
    浏览(39)
  • 【正点原子】STM32F103Core Board系列小实验从零开始(一)安装并激活Keil5、安装芯片支持包

    本文涉及到的所有软件的都在这个百度云链接里面: 链接:https://pan.baidu.com/s/1h-G50SPYcHnRnXnn3dDl-A?pwd=v0a3 提取码:v0a3 右键以 管理员身份 运行mdk514.exe,选择 是 Next 勾选agree,Next 选择安装位置,建议不要安装在C盘,Next 随便乱填,Next 稍等一会 可能会弹出如图的安装界面,选

    2024年02月16日
    浏览(45)
  • 【Flink数据传输(一)】NetworkStack架构概述:实现tm之间的数据交换

    NetworkStack提供了高效的网络I/O和反压控制 除了各个组件之间进行RPC通信之外,在Flink集群中TaskManager和TaskManager节点之间也会发生数据交换,尤其当用户提交的作业涉及Task实例运行在不同的TaskManager上时。Task实例之间的数据交换主要借助Flink中的NetworkStack实现。NetworkStack不仅提

    2024年03月25日
    浏览(47)
  • h3c路由器和三层交换机之间连接配置

    H3C路由器和三层交换机之间的连接可以通过物理线缆连接,常用的连接方式有以下两种: 直接连接:将H3C路由器和三层交换机之间的物理接口通过网线直接连接。 间接连接:将H3C路由器和三层交换机之间的物理接口通过交换机连接。 接下来,我将为您介绍如何在H3C路由器和

    2024年02月08日
    浏览(51)
  • 如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别

    如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别。 几乎大部分网络都有交换机、路由器和防火墙这三种基本设备,因此这三种设备对于网络而言非常重要,很多人对这三种设备的使用容易弄混。 一般网络部署: 或者抽象为这种部署模式: 几乎每个网络

    2024年02月12日
    浏览(47)
  • 在交换机之间连接的端口配置 stp edged-port enable(边缘端口)有什么影响?

    命令:(将某个端口配置为边缘端口) interface g0/0/1  stp edged-port enable   为防止环路造成网络故障,一般我们会配置STP相关协议,例如: STP、RSTP、MSTP ,华为交换设备默认开启 MSTP协议 。 开启STP协议后,当网络拓扑发生相关变化时,BPDU选举就会随之发生改变,意味着会耗时,

    2024年02月03日
    浏览(44)
  • 两台服务器分别绑定一台交换机,两台服务器之间网络却ping不通,怎么办?

    如果两台服务器分别绑定在同一台交换机上,但是它们之间无法互相ping通,可能有以下几种原因导致。 1.检查网络连接: 确保两台服务器的网线正确连接到交换机的可用端口。检查连接的物理状态,包括插头是否牢固、灯光指示是否正常等。 2.验证IP配置: 确保两台服务器

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包