主页 > 怎么在华为下imtoken > 使用 Loom SDK 构建以太坊侧链并部署智能合约
使用 Loom SDK 构建以太坊侧链并部署智能合约
前两天写了一篇使用Truffle开发链上记事本的文章[1]。 很多人说写这样的笔记要花多少钱。 在这篇文章中,让我们看看如何将链上记事本智能合约迁移到Loom SDK 构建的以太坊侧链,将在下一篇文章中介绍如何用loom.js[2] 重写这个DApp。
关于织机
Loom(或 Loom Network)是一个探索区块链 Layer 2 扩容技术的团队。 他们正在尝试构建一个可用于游戏和其他领域的二层网络(Layer 2)平台。 目前开发的两个重要产品是 Loom PlasmaChain 和 Loom SDK。
织机等离子链
Loom PlasmaChain 是一个高性能的 DPoS 侧链,它实现了 Plasma Cash 框架模型 [3](提供 1-3 秒的交易确认时间)。
这条侧链带来的特点是显而易见的。 它可以获得以太坊底层网络的安全背书,让我们可以使用以太坊上发行的Token(包括ERC20和ERC721支持),享受DPos共识带来的收益。 高性能。
以太坊交易确认至少需要 15 秒,并且需要 gas 费,所以当然牺牲了一些去中心化。
这张图可以展示 PlasmaChain 和以太坊之间的关系。 未来会链接多个侧链。 根据 PlasmaChain 官方整合,排名前 100 的 ERC20 代币,包括 6 个稳定币。
Loom SDK(工具集)
Loom SDK 允许开发者快速构建自己的区块链(DApp 侧链),同时也提供了一些用于开发和部署应用程序的工具。 这包括:
用于创建您自己的应用程序链的可执行 loom 命令行工具。
有时狭义的 Loom SDK 指的是单独的工具
其他一些工具,比如用于主链和侧链之间资产转移的工具:plasma-cli gateway-cli。
本文后面将介绍用于部署合约和开发DApps的JavaScript SDK,包括Loom Truffle Provider和loom-js。
用于部署合约和开发 DApp 的 Go SDK。
以及游戏相关SDK的开发:Cosos SDK、Unity SDK。
本文的重点是介绍如何使用 Loom SDK 创建自己的链并部署应用程序。
Loom 安装并启动区块链 Loom 安装
loom命令行工具的安装很简单,直接下载可执行文件,在控制台输入:
wget https://private.delegatecall.com/loom/osx/stable/loomchmod +x loom
复制
您可以将 loom 添加到环境变量中以备后用。
我使用的系统是Mac OS。 如果你用的是Linux,wget后面的url是,Window暂时不支持,可以选择虚拟机。
初始化链
mkdir loom-chain # 为侧链创建一个目录cd loom-chainloom init
复制
初始化命令会生成genesis.json和chaindata目录,genesis.json是本侧链的创世区块配置,chaindata目录用户保存区块数据。
运行区块链
使用以下命令启动新初始化的 DApp 侧链:
loom run
复制
输出如下所示:
I[29046-04-29|20:46:50.356] Loading IAVL Store module=loomI[29046-04-29|20:46:50.362] Using simple log event dispatcherI[29046-04-29|20:46:50.368] Deployed contract vm=plugin location=coin:1.0.0 name=coin address=default:0xe288d6eec7150D6a22FDE33F0AA2d81E06591C4dInit DPOS Params &dpos.DPOSInitRequest{Params:(*dpos.Params)(0xc000e44dc0), Validators:[]*types.Validator{(*types.Validator)(0xc000e46dc0)}, XXX_NoUnkeyedLiteral:struct {}{}, XXX_unrecognized:[]uint8(nil), XXX_sizecache:0}I[29046-04-29|20:46:50.369] Deployed contract vm=plugin location=dpos:1.0.0 name=dpos address=default:0x01D10029c253fA02D76188b84b5846ab3D19510DE[29046-04-29|20:46:50.374] Couldn't connect to any seeds module=p2pI[29046-04-29|20:46:50.374] Starting RPC HTTP server on [::]:46658 module=query-serverI[29046-04-29|20:46:50.374] Starting RPC HTTP server on 127.0.0.1:9999 module=query-server
复制
启动的侧链运行在46658端口,可以通过区块链浏览器://127.0.0.1:46658查看本测试链的区块数据,如图:
它是 Plasma Chain 的区块链浏览器。 在block browser浏览器下方,可以选择链接的RPC服务器,选择本地IP和端口。
现在链已准备就绪,下一步是开发和部署 DApp。 我们仍然使用 Truffle 进行开发。 不熟悉的可以参考:Truffle官方开发文档-中文[4]
在侧链上开发和部署智能合约
在使用Truffle开发链上notebook[5]一文中,介绍了如何开发这个DApp,这里不再赘述。
这个链上记事本的源代码在 GitHub[6]。 在进行以下操作之前,需要先git clone到本地:
> git clone git@github.com:xilibi2003/note_dapp.git> npm install # 安装相应的依赖
复制
Truffle 配置侧链网络
原代码中Truffle是连接以太坊网络的,所以需要修改truffle.js加入新创建的侧链网络,这和我们介绍的使用truffle-hdwallet-provider连接Infura网络的原理类似更早之前,连接侧链网络还需要提供一个Provider,即Loom Truffle Provider[7],在修改配置前先安装:
npm install loom-truffle-provider --save
复制
然后修改配置文件truffle.js,(有Truffle配置[8]文档),参考配置如下:
const { readFileSync } = require('fs')const LoomTruffleProvider = require('loom-truffle-provider')
const chainId = 'default'const writeUrl = 'http://127.0.0.1:46658/rpc'const readUrl = 'http://127.0.0.1:46658/query'const privateKey = readFileSync('./priv_key', 'utf-8')
const loomTruffleProvider = new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey)
module.exports = { networks: { loom_dapp_chain: { provider: loomTruffleProvider, network_id: '*' } }}
复制
在配置中,我们添加了一个新的网络 loom_dapp_chain,由 LoomTruffleProvider 提供。 :46658/用于启动侧链节点使用loom run提供的RPC服务。 细心的同学应该已经发现了priv_key,这是用来部署合约到侧链链上账户的私钥文件,下面我们来创建一下。
配置链接到其他侧链,可以参考PlasmaChain测试网[9]
创建测试链账户
loom 工具提供了创建帐户的选项。 在项目note_dapp目录下,执行如下命令:
$ loom genkey -k priv_key -a pub_key
复制
输出如下(当然你的账户会和我的不一样):
local address: 0x8b7A68cFf3725ca1b682XLb575bC891e381138ef8local address base64: i3poz/NyXKG2gv5XW8iR44ETjvg=
复制
此命令将在当前文件夹中生成私钥和公钥文件:priv_key 和 pub_key。 priv_key 文件包含用于稍后将合约部署到侧链的私钥。
部署到 DApp 侧链
在执行部署时(需要确保链当前正在运行),使用--network指定网络,命令如下:
truffle migrate --network loom_dapp_chain
复制
输出结构如下:
Compiling ./contracts/Migrations.sol...Compiling ./contracts/NoteContract.sol...Writing artifacts to ./build/contracts
Starting migrations...======================> Network name: 'loom_dapp_chain'> Network id: 13654820909954> Block gas limit: 0
.......
2_deploy_contract.js====================
Deploying 'NoteContract' ------------------------ > transaction hash: 0x88a6131cb89fcf...d72d3f92ceb2e > Blocks: 0 Seconds: 0 > contract address: 0x0611Afc2fac9B72f5a75E1BC330Ba4c5da103217 > account: 0x8b7A68cFf3725ca1b682XLb575bC891e381138ef8 > balance: 0 > gas used: 0 > gas price: 0 gwei > value sent: 0 ETH > total cost: 0 ETH
> Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0 ETH
Summary=======> Total deployments: 2> Final cost: 0 ETH
复制
从这个输出中,将列出部署的网络名称、网络 id、交易哈希、合约地址等信息怎么搭建以太坊侧链,并且还将在构建目录中生成相应的文件 contracts/NoteContract.json 以及示例部署操作。
与侧链上的智能合约交互
Truffle 提供了一个控制台 truffle console[10]
启动控制台
首先通过--network选项指定连接DApp侧链loom_dapp_chain,进入控制台,命令如下:
truffle console --network loom_dapp_chain
复制
进入控制台后怎么搭建以太坊侧链,控制台提示文字如下:
truffle(loom_dapp_chain)>
复制
然后我们就可以在这个控制台中执行交互式命令了。
获取合约实例
truffle(loom_dapp_chain)> let instance = await NoteContract.deployed()truffle(loom_dapp_chain)> instance
复制
检查实例会输出实例实例的详细信息,使用的Provider,包括哪些方法,ABI描述等,结果如下:
TruffleContract {...web3: Web3 { class_defaults: { from: '0x8b7A68cFf3725ca1b682XLb575bC891e381138ef8', gas: 6721975, gasPrice: 20000000000 },currentProvider: TruffleLoomProvider { _engine: [LoomProvider], send: [Function], _alreadyWrapped: true }, network_id: '13654820909954' }, methods: { 'notes(address,uint256)': { ... }, 'addNote(string)': {... }, 'getNotesLen(address)': {...}, 'modifyNote(address,uint256,string)': { ... }, abi: [...]}
复制
通过合约实例调用合约函数
调用合约添加备注:
truffle(loom_dapp_chain)> instance.addNote("abc");
复制
获取当前账号(后面查看笔记数量的功能需要用到账号作为参数,所以先获取账号):
truffle(loom_dapp_chain)> let accounts = await web3.eth.getAccounts()truffle(loom_dapp_chain)> accounts[0]
复制
这时控制台会打印出账户地址:
‘0x8b7A68cFf3725ca1b682XLb575bC891e381138ef8’
复制
查看该账号下的笔记数量:
truffle(loom_dapp_chain)> let noteNum = await instance.getNotesLen("0x8b7A68cFf3725ca1b682XLb575bC891e381138ef8")truffle(loom_dapp_chain)> noteNum.toNumber()# 输出结果1
复制
调用其他方法类似,这里就不一一解释了,可以参考Truffle Documentation - Interacting with Contracts[11]
下一篇文章将继续介绍如何在DApp中与合约进行交互。
加入知识星球[12],与一群优秀的区块链从业者一起学习。
区块链简单讲解[13] - 系统学习区块链,学区块链的人都在这里,打造最好的区块链技术博客。 因为微信不支持链接,感兴趣的同学可以阅读原文:
参考
[1] 使用Truffle开发链上notebook: [2] 使用loom.js重写这个DApp: [3] Plasma Cash框架模型: [4] Truffle官方开发文档-中文: [5] 使用Truffle开发a chain 在记事本上:[6] GitHub:[8] Truffle 配置:[9] PlasmaChain 测试网络:[10] truffle 控制台:#[11] Truffle 文档 - 与合约交互:[13] 用简单的术语解释区块链: