Bytom 儲蓄分紅 DAPP 開發指南

儲蓄分紅DAPP

儲蓄分紅合約簡介

儲蓄分紅合約指的是項目方發起了一個鎖倉計劃(即儲蓄合約和取現合約),用戶可以在準備期自由選擇鎖倉金額參與該計劃,等到鎖倉到期之後還可以自動獲取鎖倉的利潤。用戶可以在準備期內(dueBlockHeight)參與儲蓄,按照合約規定可以 1:1 獲取同等數量的儲蓄票據資產,同時用戶鎖倉的資產(deposit)將放到取現合約中,並且項目方是無法動用的,等到鎖倉期限(expireBlockHeight)一到,用戶便可以調用取現合約將自己儲蓄的資產連本待息一同取出來。其示意圖如下:

diagram.png

從上圖中可以看出,項目方發佈了一個利潤爲20%的鎖倉項目,其中儲蓄合約FixedLimitCollect鎖定了1000個票據資產(bill),同時項目方將200個儲蓄資產(deposit)鎖定到利息合約中。待項目方發佈完合約之後,所有用戶便可以參與了。例如上圖中user1調用合約儲蓄了500,這500個儲蓄資產將被鎖定在取現合約FixedLimitProfit中,同時user1獲得了500個票據資產,剩餘找零的資產將繼續鎖定在儲蓄合約FixedLimitCollect中,以此類推,user2user3也是相同的流程,直到儲蓄合約沒有資產爲止。取現合約FixedLimitProfit跟儲蓄合約的模型大致相同,只是取現合約是由多個UTXO組成的,用戶在取現的時候可以並行操作。但是如果合約中的面值不能支持用戶一次性取現的話,需要分多次提取。例如user1擁有500個票據資產,而可以獲得的本息總額爲600,但是取現的UTXO面值爲500,那麼user1一次最多隻能取500,剩下的100需要再構造一筆交易來提現。

合約源代碼

// 儲蓄合約
import "./FixedLimitProfit"
contract FixedLimitCollect(assetDeposited: Asset,
                        totalAmountBill: Amount,
                        totalAmountCapital: Amount,
                        dueBlockHeight: Integer,
                        expireBlockHeight: Integer,
                        additionalBlockHeight: Integer,
                        banker: Program,
                        bankerKey: PublicKey) locks billAmount of billAsset {
    clause collect(amountDeposited: Amount, saver: Program) {
        verify below(dueBlockHeight)
        verify amountDeposited <= billAmount && totalAmountBill <= totalAmountCapital
        define sAmountDeposited: Integer = amountDeposited/100000000
        define sTotalAmountBill: Integer = totalAmountBill/100000000
        verify sAmountDeposited > 0 && sTotalAmountBill > 0
        if amountDeposited < billAmount {
            lock amountDeposited of assetDeposited with FixedLimitProfit(billAsset, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
            lock amountDeposited of billAsset with saver
            lock billAmount-amountDeposited of billAsset with FixedLimitCollect(assetDeposited, totalAmountBill, totalAmountCapital, dueBlockHeight, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
        } else {
            lock amountDeposited of assetDeposited with FixedLimitProfit(billAsset, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
            lock billAmount of billAsset with saver
        }
    }
    clause cancel(bankerSig: Signature) {
        verify above(dueBlockHeight)
        verify checkTxSig(bankerKey, bankerSig)
        unlock billAmount of billAsset
    }
}
// 取現合約(本金加利息)
contract FixedLimitProfit(assetBill: Asset,
                        totalAmountBill: Amount,
                        totalAmountCapital: Amount,
                        expireBlockHeight: Integer,
                        additionalBlockHeight: Integer,
                        banker: Program,
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
    clause profit(amountBill: Amount, saver: Program) {
        verify above(expireBlockHeight)
        define sAmountBill: Integer = amountBill/100000000
        define sTotalAmountBill: Integer = totalAmountBill/100000000
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill < totalAmountBill
        define gain: Integer = totalAmountCapital*sAmountBill/sTotalAmountBill
        verify gain > 0 && gain <= capitalAmount
        if gain < capitalAmount {
            lock amountBill of assetBill with banker
            lock gain of capitalAsset with saver
            lock capitalAmount - gain of capitalAsset with FixedLimitProfit(assetBill, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
        } else {
            lock amountBill of assetBill with banker
            lock capitalAmount of capitalAsset with saver
        }
    }
    clause cancel(bankerSig: Signature) {
        verify above(additionalBlockHeight)
        verify checkTxSig(bankerKey, bankerSig)
        unlock capitalAmount of capitalAsset
    }
}

合約的源代碼說明可以具體參考Equity合約介紹.

注意事項:

  • 時間期限不是具體的時間,而是通過區塊高度來大概估算的(平均區塊時間間隔大概爲2.5分鐘)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情況下參與計算都是以neu爲單位的,然而虛擬機的int64類型的最大值是9223372036854775807,爲了避免數值太大導致計算溢出,所以對計算的金額提出了金額限制(即amountBill/100000000
  • 另外clause cancel是項目方的管理方法,如果儲蓄或者取現沒有滿額,項目方也可以回收剩餘的資產

編譯並實例化合約

編譯Equity合約可以參考一下Equity編譯器的介紹說明。假如儲蓄合約FixedLimitCollect的參數如下:

assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
totalAmountBill         :10000000000
totalAmountCapital      :20000000000
dueBlockHeight          :1070
expireBlockHeight       :1090
additionalBlockHeight   :1100
banker                  :0014dedfd406c591aa221a047a260107f877da92fec5
bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf

其中bankerKey是管理員的publicKey,可以通過比原鏈的接口list-pubkeys來獲取,注意管理員需要保存一下對應的rootXpubPath,否則無法正確調用clause cancel

實例化合約命令如下:

// 儲蓄合約
./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf

// 取現合約
./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf

發佈合約交易

發佈合約交易即將資產鎖定到合約中。由於目前無法在比原的dashboard上構造合約交易,所以需要藉助外部工具來發送合約交易,比如postman。按照上述示意圖所示,項目方需要發佈1000個儲蓄資產的儲蓄合約和200個利息資產取現合約。假設項目方需要發佈1000個儲蓄資產(假如精度爲8,那麼1000個在比原鏈中表示爲100000000000)的鎖倉合約,那麼他需要將對應數量的票據鎖定在儲蓄合約中,其交易模板如下:

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ILGLSTC00A02",
      "amount": 20000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "account_id": "0ILGLSTC00A02",
      "amount": 100000000000,
      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
      "type": "spend_account"
    },
    {
      "amount": 100000000000,
      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
      "type": "control_program"
    }
  ],
  "ttl": 0,
  "time_range": 1521625823
}

合約交易成功後,合約control_program對應的UTXO將會被所有用戶查詢到,使用比原鏈的接口list-unspent-outputs即可查詢。

此外,開發者需要存儲一下合約UTXOassetIDprogram,以便在DAPP的前端頁面的config配置文件和bufferserver緩衝服務器中調用。如上所示:

// 儲蓄合約
assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3
program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0

// 取現合約
assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0

儲蓄分紅DAPP架構模型

比原鏈的DAPP總體框架模型描述了DAPP的大致結構模型,結合儲蓄分紅合約案例,其具體流程如下:

flow.png

DAPP前端

儲蓄分紅合約前端邏輯處理流程大致如下:

  • 1)調用插件

    比原的chrome插件源碼位於Bytom-JS-SDK,開發比原DAPP時調用插件的說明可以參考Dapp Developer Guide

  • 2)配置合約參數

    Dapp demo中需要配置實例化的參數爲assetDepositedtotalAmountBilltotalAmountCapitaldueBlockHeightexpireBlockHeightadditionalBlockHeightbankerbankerKey。其前端配置文件爲configure.json.js

    var config = {
        "solonet": {
            "depositProgram": "2091194ddbf3614cafbadb1274c33e61afd4d5044c6ec4c30f8202980199c30083160014c800033d5e94de5f22e23a6d3cbeaed87b55bd640600204aa9d101050010a5d4e8203310d9951697418af3cdbe7a9cdde1dc49bb5439503dacb33828d6c9ef5af5a24dfc01567a64f5010000c358797ca153795579a19a6957790400e1f5059653790400e1f505967c00a07c00a09a69c358797c9f91616429010000005879c2547951005b79895a7989597989587989537a894c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac890274787e008901c07ec169515879c2515a79c16952c3597994c251005a79895979895879895779895679895579890274787e008901c07ec16963f0010000005879c2547951005b79895a7989597989587989537a894c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac890274787e008901c07ec16951c3c2515a79c16963fc010000567a567aae7cac747800c0",
            "profitProgram": "2091194ddbf3614cafbadb1274c33e61afd4d5044c6ec4c30f8202980199c30083160014c800033d5e94de5f22e23a6d3cbeaed87b55bd640600204aa9d101050010a5d4e820666f298d34806a6db0528c3b3d081bc00fa58aa393e7c42f90d67eb7db2a524f4c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac747800c0",
            "assetDeposited": "3310d9951697418af3cdbe7a9cdde1dc49bb5439503dacb33828d6c9ef5af5a2",
            "assetBill": "666f298d34806a6db0528c3b3d081bc00fa58aa393e7c42f90d67eb7db2a524f",
            "totalAmountBill": 1000000000000,
            "totalAmountCapital": 2000000000000,
            "dueBlockHeight": 0,
            "expireBlockHeight": 0,
            "banker": "0014c800033d5e94de5f22e23a6d3cbeaed87b55bd64",
            "gas": 0.4
        },
        "testnet":{
            "depositProgram": "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da240203da2402060080f420e6b50600407a10f35a2000d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd4d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0",
            "profitProgram": "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da2402060080f420e6b50600407a10f35a20f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c4ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0",
            "assetDeposited": "00d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd",
            "assetBill": "f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c",
            "totalAmountBill": 100000000000000,
            "totalAmountCapital": 200000000000000,
            "dueBlockHeight": 140506,
            "expireBlockHeight": 140506,
            "banker": "00147211ec12410ce8bd0d71cab0a29be3ea61c71eb1",
            "gas": 0.4
        }
    }
  • 3)前端預計算處理

    以儲蓄合約FixedLimitCollect爲例,前端需要對該合約進行verify語句的預判斷邏輯,以防用戶輸入參數之後執行失敗。此外,合約中billAmount of billAsset表示鎖定的資產和數量,而billAmountbillAssetutxohash都是儲存在緩衝服務器的數據表裏面,因此前端需要調用list-utxo查找與該資產assetprogram相關的所有未花費的utxo。 具體可以參考DAPP DEMO前端案例

  • 4)交易組成

    比原的交易是多輸入多輸出的模板結構,如果合約中包含了多個lockunlock語句,那麼就需要用戶構造多輸入多輸出的交易模板,同時,構造交易還需要根據lock語句或unlock語句來變換。交易構造具體可以參考儲蓄合約交易模型取現合約交易模型的前端源代碼。

    • 交易input結構如下:

      spendUTXOAction(utxohash)表示花費的合約utxo,其中utxohash表示合約UTXOhash,而spendWalletAction(amount, Constant.assetDeposited)表示用戶輸入的儲蓄或取現的數量(僅包含中需要資產交換的合約中),而資產類型則由前端固定。

      export function spendUTXOAction(utxohash){
          return {
              "type": "spend_utxo",
              "output_id": utxohash
          }
      }
      
      export function spendWalletAction(amount, asset){
          return {
              "amount": amount,
              "asset": asset,
              "type": "spend_wallet"
          }
      }
      
      const input = []
      input.push(spendUTXOAction(utxohash))
      input.push(spendWalletAction(amount, Constant.assetDeposited))
    • 交易output結構如下:

      根據合約中if-else判定邏輯,下面便是儲蓄分紅合約的output的構造模型。

      export function controlProgramAction(amount, asset, program){
          return {
              "amount": amount,
              "asset": asset,
              "control_program": program,
              "type": "control_program"
          }
      }
      
      export function controlAddressAction(amount, asset, address){
          return {
              "amount": amount,
              "asset": asset,
              "address": address,
              "type": "control_address"
          }
      }
      
      const output = []
      if(amountDeposited < billAmount){
          output.push(controlProgramAction(amountDeposited, Constant.assetDeposited, Constant.profitProgram))
          output.push(controlAddressAction(amountDeposited, billAsset, saver))
          output.push(controlProgramAction((billAmount-amountDeposited), billAsset, Constant.depositProgram))
      }else{
          output.push(controlProgramAction(amountDeposited, Constant.assetDeposited, Constant.profitProgram))
          output.push(controlAddressAction(billAmount, billAsset, saver))
      }
  • 5)啓動前端服務

    編譯前端命令如下:

    npm run build

    啓動之前需要先啓動bufferserver緩衝服務器,然後再啓動前端服務,其前端啓動命令如下:

    npm start

DAPP緩衝服務器

緩衝服務器主要是爲了在管理合約UTXO層面做一些效率方面的處理,包括了對bycoin服務器是如何同步請求的,此外對DAPP的相關交易記錄也進行了存儲。具體可以參考一下bufferserver源代碼

  • 1)儲蓄分紅合約的架構說明如下:

    • 緩衝服務器構成,目前設計了3張數據表:baseutxobalance表。其中base表用於初始化該DAPP關注的合約program,即在查找utxo集合的時候,僅僅只需過濾出對應的program和資產即可; utxo表是該DAPP合約的utxo集合,其數據是從bycoin服務器中實時同步過來的,主要是爲了提高DAPP的併發性; balance表是爲了記錄用戶參與該合約的交易列表。
    • 後端服務由API進程和同步進程組成,其中API服務進程用於管理對外的用戶請求,而同步進程包含了兩個方面:一個是從bycoin服務器同步utxo,另一個是則是通過區塊鏈瀏覽器查詢交易狀態
    • 項目管理員調用update-base接口更新DAPP關注的合約programasset。而utxo同步進程會根據base表的記錄來定時掃描並更新本地的utxo表中的信息,並且根據超時時間定期解鎖被鎖定的utxo
    • 用戶在調用儲蓄或取現之前需要查詢合約的utxo是否可用,可用的utxo集合中包含了未確認的utxo。用戶在前端在點擊儲蓄或取現按鍵的時候,會調用utxo最優匹配算法選擇最佳的utxo,然後調用update-utxo接口對該utxo進行鎖定,最後就用戶就可以通過插件錢包調用bycoin服務器的構建交易接口來創建交易、簽名交易和提交交易。倘若所有合約utxo都被鎖定了,則會縮短第一個utxo的鎖定時間爲60s,設置該時間間隔是爲了保證未確認的交易被成功驗證並生成未確認的utxo。如果該時間間隔並沒有產生新的utxo,則認爲前面一個用戶並沒有產生交易,則60s後可以再次花費該utxo
    • 用戶發送交易成功後會生成兩條balance記錄表,默認狀態是失敗的,其中交易ID用於向區塊鏈瀏覽器查詢交易狀態,如果交易成功則會更新balance的交易狀態。此外,前端頁面的balance列表表只顯示交易成功的記錄。
  • 2)編譯bufferserver源代碼

    按照README安裝部署服務需要的軟件包MysqlRedis,然後下載源代碼並編譯:

    make all

    編譯完成之後,在target目錄下會生成可執行文件apiupdater

  • 3)啓動服務

    使用root用戶創建數據庫和數據表,其命令如下:

    mysql -u root -p < database/dump.sql

    修改配置文件config_local.json,字段說明參考READMEconfig配置參數詳解。

    啓動apiupdater服務器,其中api是提供JSON RPC請求的服務進程,updater是提供同步blockcenter和區塊鏈瀏覽器數據請求的服務進程。

    ./target/api config_local.json
    
    ./target/updater config_local.json
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章