问:能完整描述一个具体的跨链过程吗? 刘毅:假设现在有一个 ERC20 的代币,比如说是 UNI,它发行在以太坊上,我们想把它跨到 PlatON 上面去。 那么以太坊这边要有一个智能合约,比如叫 Vault 合约,它是跨链桥的一个桥墩;跨链的用户要做两笔交易,第一笔交易是调用 UNI 合约的 Approve 方法,允许 Vault 合约转走多少用户的 UNI。 第二笔交易是发给 Vault 合约的 Lock 方法,把要锁定的币种(本例是 UNI)和数量(比如 500 个) 作为参数传进去,然后还要提供一个 PlatON 的地址,说我锁 500 个是为了在这个地址上铸造出 500 个 UNI 的替代品。 这个时候,Vault 合约就会去调用 UNI 合约做 UNI 的转移,因为 Vault 合约已经被 Approve 了,就可以把 UNI 从用户地址转到 Vault 合约的地址上,也就是把 UNI 锁住。 锁完之后,Vault 合约就会发一个事件,比如叫 AssetLock 事件;链下进程是通过 RPC 接口连在以太坊节点上的,它会订阅 Vault 合约的 AssetLock 事件,这个事件只要一出现在日志里,链下进程就得到这个事件了。 这个事件里包含相关参数,比如锁定的是哪个币,锁了多少,另一条链上的受益人是谁;链下进程会等待比如说 100 个块的确认,不可逆转;然后,链下进程也有一个连接 PlatON 的 RPC 接口,它会提交一笔交易到 PlatON,假设这笔交易叫 Mint。 PlatON 上也会有一个合约,比如叫 Control 合约,它是跨链桥的另一个桥墩;Control 合约事先会创建一个类似 ERC20 的合约,比如叫 EUNI,Control 合约是这个合约的 owner,也就是说它有权力控制 EUNI 合约的代币供应。 Control 合约收到 Mint 请求后,验证这个请求确实来自于见证人,就会调用 EUNI 合约的 Mint 方法,告诉它给某个地址铸造 500 个 EUNI 代币;EUNI 铸造出来后,就会放在用户之前提供的地址上,用户就可以用了。 这个时候,假设用户把 EUNI 转给了另外一个用户,新用户想要以太坊上的 UNI,那他要做的操作是先 Approve,然后调用 Control 合约的 Redeem 方法,烧掉比如说 100 个 EUNI,并释放一个事件叫 AssetBurn。 链下进程监控到 Control 合约的 AssetBurn 事件,就会给以太坊 Vault 合约发一个交易请求,调用 Release 接口,以太坊验证这个交易是来自于见证人后,就会把 UNI 从 Vault 合约的地址上转移到指定的用户地址上,用户就得到了原始的 UNI。这就是一个完整的跨链过程。 问:可以抛开「链下进程」这个角色实现跨链吗?比如一条链直接去监听另一条链,然后完成相关的跨链操作? 刘毅:这是做不到的,因为链都不能主动发起操作,链的逻辑都是被动的。 唯一的例外是 Substrate (Polkadot 开发框架),它上边有 off-chain worker 这个机制,可以用一个链下工作机发起请求。其他的,比如以太坊智能合约,是不能自己主动发起干什么事的,它只有被调用。 (责任编辑:admin1) |