1基本流程
Asch有三種網絡類型,分別是localnet,testnet,mainnet,后兩種是發布到線上的,可以通過公網訪問。第一種localnet是運行在本地的,只有一個節點的私鏈,主要是為了方便本地測試和開發。Dapp的開發同樣要涉及到這三種網絡,即
- 第一步,在localnet的開發,本地測試
- 第二步,在testnet測試
- 第三步,正式發布到mainnet
2啟動localnet
每個開發者都可以在本地啟動自己的localnet的,需要先下載阿希源碼。
> git clone https://github.com/AschPlatform/asch.git
下載后就可以參照該項目的README進行后面的安裝,運行操作。
3安裝asch-cli
> npm install -g asch-cli
注意這一步不要用淘寶的cnpm,有漏洞
4在本地創建一個應用程序
首先要進入你的阿希源碼目錄,並確保localnet的啟動
> 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必須的元信息,創世塊以及一個初始的目錄結構
應用生成模板需要使用dapps子命令,如下所示
# 生成應用模板的時候,最好建立一個新目錄
> mkdir asch-test-dapp && cd asch-test-dapp
> asch-cli dapps -a
接下來,我們要回答一系列的問題,以生成應用的注冊信息與創世塊
? 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,數字越大越安全,但效率和費用越高- 創世塊中可以創建內置資產,但不是必須的,內置資產無法跨鏈轉賬,只能在鏈內使用
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,這個過程叫充值,相反的過程叫做提現,這都是通過阿希的跨鏈協議實現的。
充值有三種方式:
- 使用交互式的網絡圖型界面,在【應用中心】的【已安裝應用列表】
- 使用
asch-cli deposit命令 - 調用
asch-js的createInTransfer函數,具體可參考阿希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合約或事務調用
合約調用也有三種方式
- 在模板應用的默認前端頁面,通過交互式網頁圖型界面進行
- 使用
asch-cli dapptransaction命令,具體可參考asch-cli使用說明 - 使用
asch-js的createInnerTransaction函數,具體可參考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實現查詢接口
在這個環節,你需要考慮的是如何給前端返回數據,比如區塊,交易,各種合約業務狀態的查詢等也可以可用這個通道將一些非全局狀態保存到本地節點,我們會在后續章節介紹這些高級用法。
