Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
82 0 0
储蓄分红合约简介
  a( O, E$ b) `. A2 [储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
& E7 i# [3 c- d  |" q" Z8 z
- J# a6 a  P) |/ a4 G8 k从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。* [! M( H" ~5 B& E  n
合约源代码
( e) }8 c* W. \) l1 Q// 储蓄合约
; l! d8 E! l0 R+ l7 j; |+ r3 Himport "./FixedLimitProfit"/ Z5 p6 ?/ h3 Y) S
contract FixedLimitCollect(assetDeposited: Asset,+ H$ s/ p) w- b* R
                        totalAmountBill: Amount,. b, F( Q  }  B) M! w* S3 T
                        totalAmountCapital: Amount,3 \( }" Z7 V% v8 Q% Z, c8 c
                        dueBlockHeight: Integer,
4 |* q7 {. p" B6 _/ A                        expireBlockHeight: Integer,
9 U& v5 b; n4 m  h8 U7 E1 I                        additionalBlockHeight: Integer,
# ^$ }1 \& J7 ^$ o% C                        banker: Program,+ q+ ?3 l. e( F7 i: g, H
                        bankerKey: PublicKey) locks billAmount of billAsset {
: A. y9 D# D% g3 s4 e( A    clause collect(amountDeposited: Amount, saver: Program) {- T; F. W4 [7 U' G2 e* a
        verify below(dueBlockHeight)0 ^  x3 O7 y3 d6 J) Z: L
        verify amountDeposited  0 && sTotalAmountBill > 0
3 s; G; R* W4 E1 t0 K# t% I# _5 b        if amountDeposited % Q9 w  `# V) L. _& S' L1 {1 c& |2 j
// 取现合约(本金加利息), g$ }. a1 I, ?/ U( s' m: o) [
contract FixedLimitProfit(assetBill: Asset,  e; x, X" a8 C! t6 m9 z2 J
                        totalAmountBill: Amount,& o& c5 j7 C1 K* v
                        totalAmountCapital: Amount,7 `9 O$ y+ R& F
                        expireBlockHeight: Integer,, z: W& S- g5 P. t# g0 U
                        additionalBlockHeight: Integer,# @2 Z) t: c7 T4 u) Q- T$ E
                        banker: Program,' a+ D2 n" r% a2 c4 L
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {# O# D: M; F: v2 P* \
    clause profit(amountBill: Amount, saver: Program) {* M$ [0 R2 K$ r- T
        verify above(expireBlockHeight)
. j( \4 f2 F' f: z        define sAmountBill: Integer = amountBill/100000000. S5 w) R0 \( x* E1 F$ |
        define sTotalAmountBill: Integer = totalAmountBill/100000000) ~3 r$ q1 K/ _
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
5 v! n- h! {- a. N合约的源代码说明可以具体参考Equity合约介绍.% Q/ Q8 {7 y* O
注意事项:
3 j# a. f7 w* e; e; U
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    ( N, k# I' B3 u0 x+ L" y/ n

    " L* ]9 _% g1 W& S5 G# Y% y编译并实例化合约
    . O3 S! J; B0 C- Q) T5 Y) V编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:
    - L6 ]7 M1 {+ Y+ aassetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    6 ~; k3 ]& U) m& ]totalAmountBill         :10000000000
    # N; ^9 n1 k9 O/ I3 J( K* htotalAmountCapital      :20000000000! [  S; y! c" O0 {1 D
    dueBlockHeight          :1070
    & t0 D: C$ G. L* H% `$ m; SexpireBlockHeight       :10903 D  {" z: |+ `! f
    additionalBlockHeight   :1100
    & x; h. L# E# }( m8 [banker                  :0014dedfd406c591aa221a047a260107f877da92fec5& k: ^5 C1 a! H$ S
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    9 c; u7 n7 w; D3 C, O3 {其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    / x; D) @' z4 [  O$ A实例化合约命令如下:
    3 z+ y& i! `5 ]+ \7 _// 储蓄合约
    3 x+ Y, ~- z, ]7 ~, h./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf% ?% Y# G8 R. U; b& t! Z
    // 取现合约
    ( ~, T2 O- d8 q' c" [./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    / R! r6 H  j2 }: J& N发布合约交易5 D  J. R; ?7 i/ e# ]' `7 g1 p
    发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:
    0 W4 c; |7 H; s+ r% @& t{
    : c2 b, R% g6 y; b1 ]  "base_transaction": null,
    - _. [+ N3 ]0 X7 w  "actions": [
    , t* b% T$ e! n8 y1 V% z9 F+ ^    {
    4 U! }% A) ~0 I+ a3 y5 }      "account_id": "0ILGLSTC00A02",( S; y- q0 W8 f  l
          "amount": 20000000,, b( }4 U7 ~& p) o6 c4 \6 v
          "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    0 Y, z, M' N! O2 m3 X! h      "type": "spend_account"5 E! W. B+ b  P; E- h3 C- E6 L
        },
    ' l  C( a) |$ _* y    {# n4 K" {1 r/ w9 G0 _1 @7 _
          "account_id": "0ILGLSTC00A02",9 y6 M' w+ U" Z) [1 l( a
          "amount": 100000000000,3 s; f/ F( u4 H
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3"," }6 m$ _0 T/ g! b! {  s
          "type": "spend_account"
    1 e$ i& @' x- ?( S    },; q- [! ?8 n: _$ b4 h" W! @! E
        {
    4 D+ H3 k. L" f) M" L      "amount": 100000000000,8 ]" _% _1 C2 v& F" X7 A! R
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    & U" X& M& W9 S" G1 Y      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",/ U# I  e) N& E: g
          "type": "control_program"
    . N' }0 h' v, |5 r/ p    }
    1 c5 o* d* J$ L- D+ J  {9 A9 T  ],
    0 n; }* y, K7 v1 E7 Y$ R  "ttl": 0,/ \% M* l4 f% @" x1 g
      "time_range": 15216258238 D. R  W  p8 S) b( c5 e( N
    }$ v5 [$ y! @$ N) U
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。2 `- Z! [7 W/ `8 i# I
    此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:
    9 @8 U; A' P, l. t+ y3 y  z$ o// 储蓄合约
      V) c& U6 S; |4 ]assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3
    5 u% k7 Q8 t0 W. A3 kprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c04 V" x3 X8 }4 _
    // 取现合约
    - m, ^* \- j2 ?0 U. KassetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee, m) a  r8 |6 Y$ C# i1 K
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0  v3 I6 I) w  L7 ~. l; }
    本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9