Asch有三种网络类型,分别是localnet,testnet,mainnet,后两种是发布到线上的,能够经过公网访问。第一种localnet是运行在本地的,只有一个节点的私链,主要是为了方便本地测试和开发。Dapp的开发一样要涉及到这三种网络,即html
每一个开发者均可以在本地启动本身的localnet的,须要先下载阿希源码。前端
> git clone https://github.com/AschPlatform/asch.git
下载后就能够参照该项目的README进行后面的安装,运行操做。node
> npm install -g asch-cli
注意这一步不要用淘宝的cnpm
,有漏洞git
首先要进入你的阿希源码目录,并确保localnet的启动github
> cd <asch source code dir> > npm install > node app.js
每一个dapp都有独立的受托人,这些受托人也是默认的记帐人,他们负责区块的生产,跨链资产的中转,与此同时能够得到交易手续费。注册dapp的时候,咱们只须要收集受托人的公钥就行,为了权力分散,最好每一个秘钥分别由一我的保管这里为了演示,咱们一次性建立5个帐户,一个dapp最多有101个受托人,最少是5个。数据库
> asch-cli crypto -g # 接下来输入 5 便可生成5个帐户 [ { address: 'AijfU9bAE6Jpt5ve7zG3LoriDamH67eLb', secret: 'easy snap cable harvest plate tone planet yellow spot employ humble what', publicKey: 'a437a1d4bedf738e8620920ef29542644e3366c635b16fc9faa6f5db744bcd5c' }, { address: 'ABGGUL5D2SoBaQTqDMAb3u9RdUjYBcmRxx', secret: 'adjust edge exist hurry joke carbon spice envelope battle shuffle hawk thought', publicKey: '522cdc822d3bec74aa5c4e972ed6cba84850f9c4d521e43fe08675e9e4759bb9' }, { address: 'AMg37s4avDUojJd6d3df7HPA3vqtRRwved', secret: 'survey spoil submit select warm chapter crazy link actual lonely pig grain', publicKey: '6ee3ae36166f69e8b9408d277486c9870f40c1b7c16016328737d6445409b99f' }, { address: 'AL5p8BHzhCU3e5pkjMYbcjUSz771MrQcQr', secret: 'march struggle gap piece entry route kind pistol chunk spell honey summer', publicKey: 'ad558e44b347a54981295fcb5ee163c2915ca03536496129103e9d72c5025d69' }, { address: 'A2WassKticpB7cx15RZfenBekthwmqXRXd', secret: 'response modify knife brass excess absurd chronic original digital surge note spare', publicKey: '6b2594ebeee9b072087e5f1e89e5c41ee2d73eb788b63abeedf5c04664f0ce5b' } ]
应用模板包括注册DAPP必须的元信息,创世块以及一个初始的目录结构npm
应用生成模板须要使用dapps
子命令,以下所示json
# 生成应用模板的时候,最好创建一个新目录 > mkdir asch-test-dapp && cd asch-test-dapp > asch-cli dapps -a
接下来,咱们要回答一系列的问题,以生成应用的注册信息与创世块api
? Enter DApp name Asch-test-dapp ? Enter DApp description Demo of asch dapp ? Enter DApp tags asch,dapp,demo ? Choose DApp category Common ? Enter DApp link https://github.com/AschPlatform/Asch-test-dapp.zip ? Enter DApp icon url https://yourdomain.com/logo.png ? Enter public keys of dapp delegates - hex array, use ',' for separator a437a1d4bedf738e8620920ef29542644e3366c635b16fc9faa6f5db744bcd5c,522cdc822d3bec74aa5c4e972ed6cba84850f9c4d521e43fe08675e9e4759bb9,6ee3ae36166f69e8b9408d277486c9870f40c1b7c16016328737d6445409b99f,ad558e44b347a54981295fcb5ee163c2915ca03536496129103e9d72c5025d69,6b2594ebeee9b072087e5f1e89e5c41ee2d73eb788b63abeedf5c04664f0ce5b ? How many delegates are needed to unlock asset of a dapp? 3 DApp meta information is saved to ./dapp.json ... ? Enter master secret of your genesis account [hidden] ? Do you want publish a inbuilt asset in this dapp? Yes ? Enter asset name, for example: BTC, CNY, USD, MYASSET XCT ? Enter asset total amount 1000000 ? Enter asset precision 8
有几个注意事项浏览器
DApp link
是为了方便普通用户自动安装,必须以.zip
结尾,若是您的dapp不打开开源或者没有准备好,能够把这个选项当作占位符,它所在的地址没必要真实存在DApp icon url
这是在阿希应用中心展现用的应用图标,必须以.jpg
或.png
结尾,若是该图片没法访问,阿希应用中心会展现一个默认的图标How many delegates ...
选项对话这个表示从dapp
跨链转帐资产时须要多少个受托人联合签名,该数字必须大于等于3小于等于101,数字越大越安全,但效率和费用越高注意这里的主链
不是指mainnet
,每一个net
下都有相应的主链,主链是相对Dapp而言。
能够咱们使用registerdapp
注册应用到主链,以下所示
> asch-cli registerdapp -f dapp.json -e "someone manual strong movie roof episode eight spatial brown soldier soup motor" # 返回结果以下 0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb
0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb
是应用ID
使用浏览器访问http://localhost:4096/api/dapps/get?id=0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb
,能够查询到该dapp了
{ "success": true, "dapp": { "name": "asch-dapp-helloworld", "description": "A hello world demo for asch dapp", "tags": "asch,dapp,demo", "link": "https://github.com/AschPlatform/asch-dapp-helloworld/archive/master.zip", "type": 0, "category": 1, "icon": "http://o7dyh3w0x.bkt.clouddn.com/hello.png", "delegates": [ "a518e4390512e43d71503a02c9912413db6a9ffac4cbefdcd25b8fa2a1d5ca27", "c7dee266d5c85bf19da8fab1efc93204fed7b35538a3618d7f6a12d022498cab", "9cac187d70713b33cc4a9bf3ff4c004bfca94802aed4a32e2f23ed662161ea50", "01944ce58570592250f509214d29171a84f0f9c15129dbea070251512a08f5cc", "f31d61066c902bebc80155fed318200ffbcfc97792511ed18d85bd5af666639f" ], "unlockDelegates": 3, "transactionId": "0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb" } }
如今咱们把第二步中建立的模板代码拷贝到阿希的安装目录下的子目录DAPP,并更名为DAPP的ID
> cp -r asch-test-dapp path/to/asch/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb
而后把第一步建立的受托人密码写入这个DAPP的配置文件中
> cat path/to/asch/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/config.json { "secrets": [ "easy snap cable harvest plate tone planet yellow spot employ humble what", "adjust edge exist hurry joke carbon spice envelope battle shuffle hawk thought", "survey spoil submit select warm chapter crazy link actual lonely pig grain", "march struggle gap piece entry route kind pistol chunk spell honey summer", "response modify knife brass excess absurd chronic original digital surge note spare" ] }
这里咱们把全部受托人的配置到同一个节点了,在生产环境中不推荐这样作,应该把秘钥尽可能分散到多个节点,以防止单点故障
> ./aschd restart
使用浏览器打开http://localhost:4096/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/
,能够访问默认的一个前端页面,该页面能够进行一些简单的接口测试
也能够观察DAPP的日志来排查一些问题
> tail -f path/to/asch/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/logs/debug.*.log
dapp的前端端通信协议通常能够分为两大类:读和写读指的是数据查询,好比内置的区块查询,交易查询,转帐记录,以及本身定义和实现的一些查询接口写指的是合约调用或事务执行,好比发起转帐,设置昵称,提现等,一样,也包括其余的由开发者实现的各类合约或事务
每个写入操做都须要消耗燃料资产,模板dapp默认的燃料是XAS,开发者能够经过调用相关接口改成适合您的燃料类型,能够设置成任意其余资产,包括内置资产。若是你的设置的燃料为外部资产,则须要从主链转入资产到这个DAPP,这个过程叫充值,相反的过程叫作提现,这都是经过阿希的跨链协议实现的。
充值有三种方式:
asch-cli deposit
命令asch-js
的createInTransfer
函数,具体可参考阿希JS的接口文档查询接口通常经过http得到协议,好比
> curl http://localhost:4096/api/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/blocks # 返回结果以下 { "blocks": [ { "id": "9fae0c8200b7f4ef8c96f264e621f01a39a0b365ff42b80232aece0f3136b0e5", "timestamp": 0, "height": 1, "payloadLength": 103, "payloadHash": "c3674e36954811f869865a3b106ada847d47b6bc1ffc0a69c1859756d34cb5ad", "prevBlockId": "", "pointId": "", "pointHeight": 0, "delegate": "8065a105c785a08757727fded3a06f8f312e73ad40f1f3502e0232ea42e67efd", "signature": "fd7423c1ce4cb82e79125e39fc13e040cefce158af69b45d035aaf5a4c78db8f66aa3e93bbdfb72bfa0dd604f64f8bebc66dd08fd17715bb77225fc0743f680b", "count": 1 } ], "count": 1, "success": true }
更多接口能够参考DAPP默认接口文档
合约调用也有三种方式
asch-cli dapptransaction
命令,具体可参考asch-cli使用说明asch-js
的createInnerTransaction
函数,具体可参考asch-js接口文档下面咱们分析下asch dapp的目录结构
dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/ ├── blockchain.db // dapp数据库文件,与主链的数据是分开存放的 ├── config.json // 应用的节点配置文件,目前主要用于配置受托人秘钥 ├── contract // 合约目录 │ └── domain.js // 域名合约的实现代码 ├── dapp.json // 注册dapp时用到的元文件 ├── genesis.json // 创世区块 ├── init.js // 应用初始化代码,能够在该文件进行一些设置、事件注册等 ├── interface // 查询接口的实现目录 │ ├── domain.js // 域名查询接口实现 │ └── helloworld.js ├── logs // 日志目录 │ └── debug.20170928.log ├── model │ └── domain.js // 域名业务数据模型定义 └── public └── index.html // 默认前端页面
曾经我在这个博客里写过咱们的开发理念
在asch dapp中实现一个业务逻辑,大概思路以下
在这个环节,你须要考虑的是在区块链中保存什么数据或状态,你的帐单内容是什么哪些字段须要创建索引,以提升客户端查询速度
这个环节,你须要考虑的是一个事务或一个调用会修改哪些状态,好比资产余额,帐户属性等咱们在sdk中提供了丰富的接口可供调用,具体可参考sdk接口文档
在这个环节,你须要考虑的是如何给前端返回数据,好比区块,交易,各类合约业务状态的查询等也能够可用这个通道将一些非全局状态保存到本地节点,咱们会在后续章节介绍这些高级用法。