天天看點

Bytom儲蓄分紅合約解析

儲蓄分紅合約簡介

儲蓄分紅合約指的是項目方發起了一個鎖倉計劃(即儲蓄合約和取現合約),使用者可以在準備期自由選擇鎖倉金額參與該計劃,等到鎖倉到期之後還可以自動擷取鎖倉的利潤。使用者可以在準備期内(

dueBlockHeight

)參與儲蓄,按照合約規定可以

1:1

擷取同等數量的儲蓄票據資産,同時使用者鎖倉的資産(

deposit

)将放到取現合約中,并且項目方是無法動用的,等到鎖倉期限(

expireBlockHeight

)一到,使用者便可以調用取現合約将自己儲蓄的資産連本待息一同取出來。其示意圖如下:

從上圖中可以看出,項目方釋出了一個利潤為

20%

的鎖倉項目,其中儲蓄合約

FixedLimitCollect

鎖定了

1000

個票據資産(

bill

),同時項目方将

200

個儲蓄資産(

deposit

)鎖定到利息合約中。待項目方釋出完合約之後,所有使用者便可以參與了。例如上圖中

user1

調用合約儲蓄了

500

,這

500

個儲蓄資産将被鎖定在取現合約

FixedLimitProfit

中,同時

user1

獲得了

500

個票據資産,剩餘找零的資産将繼續鎖定在儲蓄合約

FixedLimitCollect

中,以此類推,

user2

user3

也是相同的流程,直到儲蓄合約沒有資産為止。取現合約

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

來擷取,注意管理者需要儲存一下對應的

rootXpub

Path

,否則無法正确調用

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

即可查詢。

此外,開發者需要存儲一下合約

UTXO

assetID

program

,以便在

DAPP

的前端頁面的

config

配置檔案和

bufferserver

緩沖伺服器中調用。如上所示:

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

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

本期的比原儲蓄分紅合約就介紹在這裡,下一期我們将詳細介紹如何基于該合約開發dapp應用

繼續閱讀