哈希时间锁合约
哈希时间锁合约(hash time lock contract,htlc)能够实现两条异构链之间资产的原子交换,即跨链转账。
如果你想
快速体验
跨链转账可以参考
体验WeCross
。
WeCross提供了Solidity版本和Golang版本的htlc基类合约,基于htlc基类合约可以轻松开发适用于不同资产类型的htlc应用合约。
Solidity版本源码:
GitHub访问链接
Gitee访问链接
Golang版本源码:
GitHub访问链接
Gitee访问链接
本章节以FISCO BCOS和Hyperledger Fabric的
示例资产合约
为例,演示如何实现两条异构链的资产互换。
准备工作
要完成资产互换,需要在各自链上部署资产合约以及哈希时间锁合约,然后通过WeCross控制台创建
跨链转账提案
,跨链路由会根据提案信息自动完成跨链转账。
部署WeCross和控制台
以
组网方式
搭建两个跨链路由
搭建WeCross
控制台
,连接跨链路由
BCOS链前期准备
假设已存在一个跨链账户
org2-admin
,且分别添加了一个BCOS2.0链账户以及Fabric1.4链账户。
进入BCOS链的WeCross控制台。
bash start.sh
[WeCross]> login org2-admin 123456
# 发行资产,资产名为htlc,最小单位1,发行数量100000000
[WeCross.org2-admin]> bcosDeploy payment.bcos.ledger contracts/solidity/LedgerSample.sol LedgerSample 1.0 token htlc 1 100000000
# 资产合约地址需要记录下来
Result: 0xf4fdcdfe0184644f09a1cfa16a945cc71a5d44ff
# 部署htlc合约
[WeCross.org2-admin]> bcosDeploy payment.bcos.htlc contracts/solidity/LedgerSampleHTLC.sol LedgerSampleHTLC 1.0
# htlc合约地址需要记录下来
Result: 0x22a83719f748da09845d91fe1a2f44437f0ad13b
要完成跨链转账,资产拥有者需要将资产的转移权授权给哈希时间锁合约。
进入BCOS链的WeCross控制台。
bash start.sh
[WeCross]> login org2-admin 123456
# approve [被授权者地址](此处为自己的哈希时间锁合约地址),[授权金额]
[WeCross.org2-admin]> sendTransaction payment.bcos.ledger approve 0x22a83719f748da09845d91fe1a2f44437f0ad13b 1000000
Txhash : 0x718e948b0ab55697c61675253acfd580104e539c85e0fcb23c0686457ea429d4
BlockNum: 46
Result : [true]
哈希时间锁合约初始化
需要将资产合约的地址和对手方的哈希时间锁合约地址保存到自己的哈希时间锁合约。
进入BCOS链的WeCross控制台。
bash start.sh
[WeCross]> login org2-admin 123456
# init [己方资产合约地址]
[WeCross.org2-admin]> sendTransaction payment.bcos.htlc init 0xf4fdcdfe0184644f09a1cfa16a945cc71a5d44ff
Txhash : 0x7df25ce20e7db6f6bba836bf54c258bb5386873e14b57e74a2371ec367b31779
BlockNum: 51
Result : [success]
# 查看资产发行者owner的地址
[WeCross.org2-admin]> call payment.bcos.htlc queryAddress
# 该地址需要记录下来,发起转账提案时需要
Result: [0x55f934bcbe1e9aef8337f5551142a442fdde781c]
# 查看owner余额,检查是否初始化成功
[WeCross.org2-admin]> call payment.bcos.htlc balanceOf 0x55f934bcbe1e9aef8337f5551142a442fdde781c
Result: [100000000]
Fabric链前期准备
假设已存在一个跨链账户org1-admin
,且分别添加了一个BCOS2.0链账户以及两个不同机构的Fabric1.4链账户。
进入Fabric链的WeCross控制台。
bash start.sh
[WeCross]> login org1-admin 123456
# 切换默认账户
[WeCross.org1-admin]> setDefaultAccount Fabric1.4 2
# 在机构2安装资产合约链码
[WeCross.org1-admin]> fabricInstall payment.fabric.ledger Org2 contracts/chaincode/ledger 1.0 GO_LANG
path: classpath:contracts/chaincode/ledger
Result: Success
# 在机构2安装哈希时间锁合约链码
[WeCross.org1-admin]> fabricInstall payment.fabric.htlc Org2 contracts/chaincode/htlc 1.0 GO_LANG
path: classpath:contracts/chaincode/htlc
Result: Success
# 切换默认账户
[WeCross.org1-admin]> setDefaultAccount Fabric1.4 1
# 在机构1安装资产合约链码
[WeCross.org1-admin]> fabricInstall payment.fabric.ledger Org1 contracts/chaincode/ledger 1.0 GO_LANG
path: classpath:contracts/chaincode/ledger
Result: Success
# 在机构1安装哈希时间锁合约链码
[WeCross.org1-admin]> fabricInstall payment.fabric.htlc Org1 contracts/chaincode/htlc 1.0 GO_LANG
path: classpath:contracts/chaincode/htlc
Result: Success
# 实例化链码,发行资产100000000
[WeCross.org1-admin]> fabricInstantiate payment.fabric.ledger ["Org1","Org2"] contracts/chaincode/ledger 1.0 GO_LANG default ["token","htlc","100000000"]
Result: Query success. Please wait and use 'listResources' to check.
# 用listResources确认payment.fabric.ledger已实例化完成(约1分钟)
[WeCross.org1-admin]> listResources
path: payment.fabric.ledger, type: Fabric1.4, distance: 0
# 实例化哈希时间锁合约,需要写入[己方资产合约名,channel]
[WeCross.org1-admin]> fabricInstantiate payment.fabric.htlc ["Org1","Org2"] contracts/chaincode/htlc 1.0 GO_LANG default ["ledger","mychannel"]
Result: Query success. Please wait and use 'listResources' to check.
# 用listResources确认payment.fabric.htlc已实例化完成(约1分钟)
[WeCross.org1-admin]> listResources
path: payment.fabric.htlc, type: Fabric1.4, distance: 0
fabric的示例资产合约通过创建一个托管账户实现资产的授权。
进入Fabric链的WeCross控制台。
bash start.sh
[WeCross]> login org1-admin 123456
# 创建一个托管账户完成授权
[WeCross.org1-admin]> sendTransaction payment.fabric.ledger createEscrowAccount 1000000
Txhash : d6a6241cbaac9cad768465213f3462f54c62e32f168c26bcce23d060315f0751
BlockNum: 1097
Result : [HTLCoin-Admin@org1.example.com-EscrowAccount]
# 查看资产发行者owner的地址
[WeCross.org1-admin]> call payment.fabric.htlc queryAddress
Result: [Admin@org1.example.com]
# 查看owner授权后的余额
[WeCross.org1-admin]> call payment.fabric.htlc balanceOf Admin@org1.example.com
# 通过授权的方式已转移1000000到托管账户
Result: [99000000]
FISCO BCOS的两个账户:
- 资产转出者:org2-admin(BCOS链发行资产的地址:0x55f934bcbe1e9aef8337f5551142a442fdde781c)
- 资产接收者:org1-admin(BCOS链账户:0x2b5ad5c4795c026514f8317c7a215e218dccd6cf)
- FISCO BCOS转账金额:700
- Fabric的两个账户: