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實現查詢接口

在這個環節,你須要考慮的是如何給前端返回數據,好比區塊,交易,各類合約業務狀態的查詢等也能夠可用這個通道將一些非全局狀態保存到本地節點,咱們會在後續章節介紹這些高級用法。

相關文章
相關標籤/搜索