Avalanche 的资产跨链机制

  • Leo
  • 更新于 1天前
  • 阅读 127

Avalanche简介Avalanche是一个能够执行通用智能合约的区块链平台。它是一个基础层,或者称为第一层(L1),可以连接到侧链并支持第二层(L2)解决方案。Avalanche将侧链和L2称为子网。Avalanche被视为以太坊网络的一个替代品。这些替代品通常统称为“替代第一层”

Avalanche 简介

Avalanche 是一个能够执行通用智能合约的区块链平台。它是一个基础层,或者称为第一层(L1),可以连接到侧链并支持第二层(L2)解决方案。Avalanche 将侧链和 L2 称为子网。Avalanche 被视为以太坊网络的一个替代品。这些替代品通常统称为“替代第一层”或 alt L1s。Avalanche 网络的特点是费用更低,交易速度比以太坊的快。 另外,Avalanche主网包含三条链,C链,P链和X链

image.png

它们的主要功能以及特性概括如下:

C链

C链属于账户模型 同时C链与EVM兼容,可以使用智能合约,基于Snowman共识创建 可以在上面创建ERC20,NFT721以及执行Defi相关的合约。

P链

账户模型,也是基于Snowman共识创建 负责协调网络验证者,进行质押或者委托质押,但和EVM 不兼容

X链

X链属于UTXO模型 是基于Avalanche共识协议创建的交易链,支持AVAX等代币的创建、兑换和管理,链上费用需要通过AVAX支付。和EVM 不兼容,主要的作用是转移AVAX

Avalanche 资产跨链的机制

上文既然提到了AVAX链有三条不同的链,而且对于的共识协议不同,那么一定会涉及到如何进行资产的跨链操作。那么我们就来讲解一下,如何进行资产的跨链 我们就以将资产从C链跨到X链作为举例。 我们知道,C链是账户模型,而X链是UTXO模型。那在进行资产跨链的时候,需要生成两笔交易,即从C链导出具体的交易,然后导入到X链。 通过一个简单的时序图来了解一下。

时序图

image.png 简单理解的话,Avax的资产跨链其实就是依赖了导出和导入的逻辑。先从源链进行导出,再到目标链进行导入。 结合着代码一起来看一下,首先是导出逻辑(从C链进行导出)

导出逻辑

async exportFromCChain(amt: BN, destinationChain: ExportChainsC, exportFee: BN) {
    // Add import fee
    // X and P have the same fee
    const importFee = avm.getTxFee()
    const amtFee = amt.add(importFee)
    // 获取当前账户的EVM地址 
    const hexAddr = this.getEvmAddress()
    // 获取当前账户的bech地址,主要是针对跨链到X链需要
    const bechAddr = this.getEvmAddressBech()

    const fromAddresses = [hexAddr]
    // 根据目标链的不同,获取不同的地址
    const destinationAddr =
        destinationChain === 'X'
            ? this.getCurrentAddressAvm()
            : this.getCurrentAddressPlatform()
    // 构建出账户类型的导出交易,包含了bechAddr和destinationChain,destinationAddr
    const exportTx = await TxHelper.buildEvmExportTransaction(
        fromAddresses,
        destinationAddr,
        amtFee,
        bechAddr,
        destinationChain,
        exportFee
    )
    // 进行签名
    const tx = await this.signC(exportTx)
    // 发送到C链
    return this.issueC(tx)
}

等待交易的状态成功之后,就可以构建导入的逻辑了,导入到X链

导入逻辑

async importToXChain(sourceChain: AvmImportChainType) {
    // 根据源链,构建utxo数据
    const utxoSet = await this.avmGetAtomicUTXOs(sourceChain)

    if (utxoSet.getAllUTXOs().length === 0) {
        throw new Error('Nothing to import.')
    }

    const xToAddr = this.getCurrentAddressAvm()

    const hrp = ava.getHRP()
    const utxoAddrs = utxoSet
        .getAddresses()
        .map((addr) => bintools.addressToString(hrp, 'X', addr))

    const fromAddrs = utxoAddrs
    const ownerAddrs = utxoAddrs

    const sourceChainId = chainIdFromAlias(sourceChain)

    // 构造基于utxo模型的交易
    const unsignedTx = await avm.buildImportTx(
        utxoSet,
        ownerAddrs,
        sourceChainId,
        [xToAddr],
        fromAddrs,
        [xToAddr]
    )
    // 对utxo模型进行签名
    const tx = await this.signX(unsignedTx)
    // 发送到x链上
    return this.issueX(tx)
}
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

5 条评论

请先 登录 后评论
Leo
Leo
江湖只有他的大名,没有他的介绍。