SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
作者介绍
虫洞社区·签约作者 steven bai
前言
如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情?
目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网络,今天我就来告诉如何通过智能雷电和闪电网络来实现跨链原子资产交换。
场景
- Alice 在某个信息发布网站上发布信息,希望用1个 BTC 置换100个 SMT
- Bob 看到以后,和 Alice 进行沟通,达成交换意见 那么Alice 和 Bob 如何不需要借助任何第三方实现原子资产置换呢?
智能雷电与闪电网络测试环境
什么是智能雷电?
智能雷电是一种最新的链下扩容方案,可以实现即时的、低费用和可扩展的支付。可以运行与以太坊和光谱链,兼容ERC20 token 和 ERC233 token。
它是跨平台的,目前支持 Windows Linux MacOS Android IOS
为了更好的适用于移动设备各种复杂的网络环境,智能雷电支持无网支付,安全快捷。
同时智能雷电也是开源的,并且正在积极维护中,想要参与和详细了解请移步官方源码.
准备步骤
安装启动智能雷电
在本地搭建一个Bob和Alice的环境,让他们建立通道。假设你已经安装好了 go
geth
如果没有请参考安装说明
连接以太坊测试网络
连接以太坊的测试链testnet
geth --testnet --fast --rpc --rpcapi eth,net,web3 --bootnodes "enode://20c9ad97c081d63397d7b685a412227a40e23c8bdc6688c6f37e97cfbc22d2b4d1db1510d8f61e6a8866ad7f0e17c02b14182d37ea7c3c8b9c2683aeb6b733a1@52.169.14.227:30303,enode://6ce05930c72abc632c58e2e4324f7c7ea478cec0ed4fa2528982cf34483094e9cbc9216e7aa349691242576d552a2a56aaeae426c5303ded677ce455ba1acd9d@13.84.180.240:30303"
启动节点
启动两个节点,分别是Alice
和Bob
启动Alice
smartraiden --datadir=.smartraiden --api-address=0.0.0.0:5001 --listen-address=127.0.0.1:400001 --address="0x69c5621db8093ee9a26cc2e253f929316e6e5b92" --keystore-path ~/.ethereum/keystore -password-file /file --eth-rpc-endpoint ws://127.0.0.1:8546
启动Bob
smartraiden --datadir=.smartraiden --api-address=0.0.0.0:5002 --listen-address=127.0.0.1:40002 --address="0x31ddac67e610c22d19e887fb1937bee3079b56cd" --keystore-path ~/.ethereum/keystore --password-file /file --eth-rpc-endpoint ws://127.0.0.1:8546
datadir
节点的本地数据存储目录api-address
rest api 监听端口address
以太坊节点地址,如果没有可以通过geth account new
创建keystore-path
--keystore-path 路径password-file
password-file 路径eth-rpc-endpoint
以太坊全节点的rpc端口,默认的websocket
是8546
此时你就已经成功搭建好了本地智能雷电节点网络,可以通过查询SmartRaiden api文档来创建通道。
安装启动闪电网络
本地搭建一个Bob和Alice的闪电网络测试环境,让他们建立通道。
连接Btcd测试链
默认你已经安装好了btcd
和lnd
,如果没有请参考安装说明
运行btcd,打开终端,然后运行
btcd --txindex --testnet --rpcuser=kek --rpcpass=kek
txindex
是必须的,以便lnd
客户端能够从中查询历史交易btcd
testnet
指定我们正在使用的testnet
网络rpcuser
和rpcpass
设置用于对btcd
实例进行身份验证的默认密码
启动节点
启动两个节点,分别是Alice
和Bob
启动Alice
lnd --rpclisten=localhost:10001 --listen=localhost:10011 --restlisten=localhost:8001 --datadir=data --logdir=log --debuglevel=info --bitcoin.testnet --bitcoin.active --bitcoin.node=btcd --btcd.rpcuser=kek --btcd.rpcpass=kek
rpclisten
:host:侦听RPC服务器的端口。这是应用程序与之通信的主要方式lndlisten
:host:侦听传入P2P连接的端口。这是在网络层面,不同于Lightning频道网络和比特币/ Litcoin网络本身。restlisten
:host:port,公开REST api,用于与lndHTTP 进行交互。例如,您可以通过向GET请求获取Alice的频道余额localhost:8001/v1/channels。datadir
:lnd将存储数据的目录logdir
:记录输出的目录。debuglevel
:所有子系统的日志记录级别。可以设置为 trace,debug,info,warn,error,critical。bitcoin.testnet
t:指定是否使用simnet或testnetbitcoin.active
:指定比特币处于活动状态。还可以包括 --litecoin.active激活Litecoin。bitcoin.node=btcd
:使用btcd完整节点与区块链连接。请注意,使用Litecoin时,选项是--litecoin.node=btcd。btcd.rpcuser和--btcd.rpcpass
:btcd实例的用户名和密码。请注意,使用Litecoin时,选项为--ltcd.rpcuser 和--ltcd.rpcpass
启动Bob
lnd --rpclisten=localhost:10002 --listen=localhost:10012--restlisten=localhost:8002 --datadir=data --logdir=log --debuglevel=info --bitcoin.testnet --bitcoin.active --bitcoin.node=btcd --btcd.rpcuser=kek --btcd.rpcpass=kek
为了不必每次都输入一堆命令,可以修改配置文件lnd.conf
- MacOS:
lnd.conf
位于:/Users/[username]/Library/Application\ Support/Lnd/lnd.conf
- Linux:
~/.lnd/lnd.conf
datadir=data
logdir=log
debuglevel=info
debughtlc=true
bitcoin.active=1
bitcoin.testnet=1
bitcoin.node=btcd
btcd.rpchost=localhost
btcd.rpcuser=kek
btcd.rpcpass=kek
现在启动Alice节点我们只需要输入
lnd --rpclisten=localhost:10001 --listen=localhost:10011 --restlisten=localhost:8001
重新打开新的终端,创建Alice
钱包密码
lncli --rpcserver=localhost:10001 --macaroonpath=data/admin.macaroon create
为了避免每次都输入--rpcserver=localhost:1000X
和--macaroonpath
标记,可以设置一些别名
alias lncli-alice="lncli --rpcserver=localhost:10001 --macaroonpath=data/admin.macaroon"
alias lncli-bob="lncli --rpcserver=localhost:10002 --macaroonpath=data/admin.macaroon"
Bob
创建钱包同上
此时Alice
和Bob
就可以创建通道了,详细教程请参考lnd api
实现方法
到这里我们为了进行SmartRaiden 和 Lighting Network 进行跨链原子资产交换的准备工作就已经完成了,具体的实现方法如下。
回到我们最初的那个问题
Alice 在某个信息发布网站上发布信息,希望用1个 BTC 置换100个 SMT
Bob和Alice SmartRaiden场景
Bob和Alice Lnd场景
1. Bob和 Alice 分别启动自己的 Atmosphere 服务
Atmosphere 服务会启动响应的SmartRaiden和Lnd
假设 Alice 在SmartRaiden的节点使用的私钥为 SA_Priv, 公钥为 SA, 在 Lnd 节点使用的私钥为 LA_Priv, 公钥为 LA
假设 Bob 在 SmartRaiden 节点使用的私钥为 SB_Priv, 公钥为 SB, 在 Lnd 节点使用的私钥为 LB_Priv, 公钥为 LB
2. Bob 的Atmosphere服务
-
1 Bob发起交易,指定Secret,金额为100,token 为 SMT,接收方为 SA
-
2 Bob等待是否收到一个金额为1BTC,密码 hash 为 Sha256(Secret),
-
3 收到以后,允许自己的 SmartRaiden 响应 SecretRequest
3. Alice 的Atmosphere 服务
-
1 Alice 在 SmartRaiden 上等待是否收到了来自 Bob 的100个 SMT交易
-
2 一旦收到, Alice 校验该交易是否有效,比如 Expiration 时间是否足够,必须大于125分钟(500Spectrum 块)
-
3 如果都一致,那么通过向自己的 Lnd 注册这个 PaymentReq,并指定过期时间为100分钟,secretHash
-
4 检测 Lnd 是否收到了密码,如果收到了,立即向 自己的SmartRaiden 注册密码