平行链 A → 中继链 (临时存储消息) → 平行链 B
消息结构:
{
"sender": "para_1",
"recipient": "para_2",
"payload": "0x...", // 编码的调用指令
"gas_limit": 1000000,
"proof": "merkle_proof" // 中继链的 Merkle 证明
}
执行流程:
1. 平行链 A 提交消息到中继链
2. 中继链在其区块中包含该消息
3. 平行链 B 读取中继链的消息队列
4. 平行链 B 验证消息的 Merkle 证明
5. 平行链 B 执行消息,更新自己的状态
场景: Alice 和 Bob 进行多次支付
步骤 1: Alice 和 Bob 各向合约存入 100 ETH(总计 200 ETH)
状态: Alice: 100, Bob: 100
步骤 2 (链下): Alice 支付 10 ETH 给 Bob
新状态: Alice: 90, Bob: 110
双方签名确认,但不上链
步骤 3 (链下): Bob 支付 5 ETH 给 Alice
新状态: Alice: 95, Bob: 105
双方再次签名确认
步骤 4 (链下): ... 重复若干次
步骤 N (上链): 双方达成一致,提交最终状态到合约
合约验证双方签名,自动分配资金
Alice 取回 95 ETH, Bob 取回 105 ETH
优势: N 次交易中,仅 2 次上链(开启和关闭),大幅降低成本和延迟
缺点: 需要参与者保持在线,不适合广播型的合约交互
原理:使用 Hash 和时间锁保证交易原子性
Alice 想用 BTC 换取 Bob 的 ETH:
步骤 1: Alice 生成随机数 r,计算其 hash: h = SHA256(r)
步骤 2: Alice 在 Bitcoin 链上创建锁定脚本:
IF hash(preimage) == h THEN send BTC to Bob
ELSE (after 24 hours) send BTC back to Alice
步骤 3: Bob 看到 Alice 的锁定条件,在 Ethereum 上创建对称的锁定:
IF hash(preimage) == h THEN send ETH to Alice
ELSE (after 12 hours) send ETH back to Bob
步骤 4: Alice 使用 r 领取 ETH(此操作在公开的交易中暴露 r)
Alice 在 Ethereum 上: preimage = r → hash(r) == h ✓ → 获得 ETH
步骤 5: Bob 看到公开的交易,获得 r,用它在 Bitcoin 上领取 BTC
Bob 在 Bitcoin 上: preimage = r → hash(r) == h ✓ → 获得 BTC
结果:要么双方都成功交换,要么都失败退款,不存在中间状态。
安全性来自于:即使恶意一方中途退出,诚实方也能通过时间锁收回资金。
代码示例:
contract AtomicSwap {
bytes32 public hashlock;
uint public timelock;
address public seller;
address payable public buyer;
uint public amount;
function initiate(bytes32 _hash, uint _time, address payable _buyer) external payable {
hashlock = _hash;
timelock = _time;
seller = msg.sender;
buyer = _buyer;
amount = msg.value;
}
// 买家使用原像来领取
function redeem(bytes calldata _preimage) external {
require(msg.sender == buyer, "Only buyer");
require(sha256(_preimage) == hashlock, "Wrong preimage");
buyer.transfer(amount);
}
// 卖家可在超时后退款
function refund() external {
require(msg.sender == seller, "Only seller");
require(block.timestamp >= timelock, "Too early");
payable(seller).transfer(amount);
}
}