Dapp开发教程一Asch Dapp

1基本流程

Asch有三种网络类型,分别是localnet,testnet,mainnet,后两种是发布到线上的,能够经过公网访问。第一种localnet是运行在本地的,只有一个节点的私链,主要是为了方便本地测试和开发。Dapp的开发一样要涉及到这三种网络,即html

  • 第一步,在localnet的开发,本地测试
  • 第二步,在testnet测试
  • 第三步,正式发布到mainnet

2启动localnet

每一个开发者均可以在本地启动本身的localnet的,须要先下载阿希源码前端

> git clone https://github.com/AschPlatform/asch.git

下载后就能够参照该项目的README进行后面的安装,运行操做。node

3安装asch-cli

> npm install -g asch-cli

注意这一步不要用淘宝的cnpm有漏洞git

4在本地建立一个应用程序

首先要进入你的阿希源码目录,并确保localnet的启动github

> cd <asch source code dir>
> npm install
> node app.js

4.1建立你的受托人帐户

每一个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' } ]

4.2生成应用模板

应用模板包括注册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

有几个注意事项浏览器

  1. DApp link是为了方便普通用户自动安装,必须以.zip结尾,若是您的dapp不打开开源或者没有准备好,能够把这个选项当作占位符,它所在的地址没必要真实存在
  2. DApp icon url这是在阿希应用中心展现用的应用图标,必须以.jpg.png结尾,若是该图片没法访问,阿希应用中心会展现一个默认的图标
  3. How many delegates ...选项对话这个表示从dapp跨链转帐资产时须要多少个受托人联合签名,该数字必须大于等于3小于等于101,数字越大越安全,但效率和费用越高
  4. 创世块中能够建立内置资产,但不是必须的,内置资产没法跨链转帐,只能在链内使用

4.3注册应用到主链

注意这里的主链不是指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"
    }
}

4.4部署应用代码及子网络

如今咱们把第二步中建立的模板代码拷贝到阿希的安装目录下的子目录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"
    ]
}

这里咱们把全部受托人的配置到同一个节点了,在生产环境中不推荐这样作,应该把秘钥尽可能分散到多个节点,以防止单点故障

4.5重启asch节点程序

> ./aschd restart

使用浏览器打开http://localhost:4096/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/,能够访问默认的一个前端页面,该页面能够进行一些简单的接口测试

也能够观察DAPP的日志来排查一些问题

> tail -f path/to/asch/dapps/0599a6100280df0d296653e89177b9011304d971fb98aba3edcc5b937c4183fb/logs/debug.*.log

4.6跨链充值

dapp的前端端通信协议通常能够分为两大类:读和写读指的是数据查询,好比内置的区块查询,交易查询,转帐记录,以及本身定义和实现的一些查询接口写指的是合约调用或事务执行,好比发起转帐,设置昵称,提现等,一样,也包括其余的由开发者实现的各类合约或事务

每个写入操做都须要消耗燃料资产,模板dapp默认的燃料是XAS,开发者能够经过调用相关接口改成适合您的燃料类型,能够设置成任意其余资产,包括内置资产。若是你的设置的燃料为外部资产,则须要从主链转入资产到这个DAPP,这个过程叫充值,相反的过程叫作提现,这都是经过阿希的跨链协议实现的。

充值有三种方式:

  1. 使用交互式的网络图型界面,在【应用中心】的【已安装应用列表】
  2. 使用asch-cli deposit命令
  3. 调用asch-jscreateInTransfer函数,具体可参考阿希JS的接口文档

4.7查询接口调用

查询接口通常经过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默认接口文档

4.8合约或事务调用

合约调用也有三种方式

  1. 在模板应用的默认前端页面,经过交互式网页图型界面进行
  2. 使用asch-cli dapptransaction命令,具体可参考asch-cli使用说明
  3. 使用asch-jscreateInnerTransaction函数,具体可参考asch-js接口文档

5目录结构

下面咱们分析下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        // 默认前端页面

6实现你的业务逻辑

曾经我在这个博客里写过咱们的开发理念

在asch dapp中实现一个业务逻辑,大概思路以下

6.1定义你的数据模型

在这个环节,你须要考虑的是在区块链中保存什么数据或状态,你的帐单内容是什么哪些字段须要创建索引,以提升客户端查询速度

6.2实现合约逻辑

这个环节,你须要考虑的是一个事务或一个调用会修改哪些状态,好比资产余额,帐户属性等咱们在sdk中提供了丰富的接口可供调用,具体可参考sdk接口文档

6.3实现查询接口

在这个环节,你须要考虑的是如何给前端返回数据,好比区块,交易,各类合约业务状态的查询等也能够可用这个通道将一些非全局状态保存到本地节点,咱们会在后续章节介绍这些高级用法。

相关文章
相关标签/搜索