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