Avalanche简介Avalanche是一个能够执行通用智能合约的区块链平台。它是一个基础层,或者称为第一层(L1),可以连接到侧链并支持第二层(L2)解决方案。Avalanche将侧链和L2称为子网。Avalanche被视为以太坊网络的一个替代品。这些替代品通常统称为“替代第一层”
Avalanche 是一个能够执行通用智能合约的区块链平台。它是一个基础层,或者称为第一层(L1),可以连接到侧链并支持第二层(L2)解决方案。Avalanche 将侧链和 L2 称为子网。Avalanche 被视为以太坊网络的一个替代品。这些替代品通常统称为“替代第一层”或 alt L1s。Avalanche 网络的特点是费用更低,交易速度比以太坊的快。 另外,Avalanche主网包含三条链,C链,P链和X链
它们的主要功能以及特性概括如下:
C链属于账户模型 同时C链与EVM兼容,可以使用智能合约,基于Snowman共识创建 可以在上面创建ERC20,NFT721以及执行Defi相关的合约。
账户模型,也是基于Snowman共识创建 负责协调网络验证者,进行质押或者委托质押,但和EVM 不兼容
X链属于UTXO模型 是基于Avalanche共识协议创建的交易链,支持AVAX等代币的创建、兑换和管理,链上费用需要通过AVAX支付。和EVM 不兼容,主要的作用是转移AVAX
上文既然提到了AVAX链有三条不同的链,而且对于的共识协议不同,那么一定会涉及到如何进行资产的跨链操作。那么我们就来讲解一下,如何进行资产的跨链 我们就以将资产从C链跨到X链作为举例。 我们知道,C链是账户模型,而X链是UTXO模型。那在进行资产跨链的时候,需要生成两笔交易,即从C链导出具体的交易,然后导入到X链。 通过一个简单的时序图来了解一下。
简单理解的话,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)
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!