Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
154 0 0
储蓄分红合约简介- q/ p$ p7 {1 W. z
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:9 s* J1 @$ [$ _3 D
# `/ O5 S$ N; B+ q" u; d8 d. g, C
从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。% |$ q( v( G6 v$ U
合约源代码
3 {5 I1 C5 W8 P5 l// 储蓄合约
4 a9 i1 f* i) l: v8 {import "./FixedLimitProfit". Z/ D" g8 W1 r9 p  D* o! v3 _
contract FixedLimitCollect(assetDeposited: Asset,% ~/ A& o8 ]5 F* f( t  b1 `
                        totalAmountBill: Amount,% R& Q: e9 [  f) j2 {
                        totalAmountCapital: Amount,+ S% X: T: S6 G7 s
                        dueBlockHeight: Integer,
/ {0 I7 h3 {5 o1 p                        expireBlockHeight: Integer,
/ K" J& P& x1 ]& d8 S. O" ^                        additionalBlockHeight: Integer,
0 q& r3 S1 O$ i  ]                        banker: Program,; e( X( ?% Y  e8 w/ v
                        bankerKey: PublicKey) locks billAmount of billAsset {
  f& b7 W8 @1 Q/ L5 C8 ~    clause collect(amountDeposited: Amount, saver: Program) {
' T3 Y4 ^! s4 r5 J9 z' u# U; a5 ^' Y        verify below(dueBlockHeight)
5 l5 W& o0 s7 R& h/ D9 l, G        verify amountDeposited  0 && sTotalAmountBill > 09 h- l# \0 z$ Y9 Q
        if amountDeposited
+ j0 g+ W+ X1 r0 l// 取现合约(本金加利息)0 \/ K7 n2 U; d) Q2 T
contract FixedLimitProfit(assetBill: Asset,
0 d5 |  T/ H/ \* q                        totalAmountBill: Amount,
( z$ Z. \6 L8 O8 E                        totalAmountCapital: Amount,) z8 M  K1 @. y) c7 Y& N. H
                        expireBlockHeight: Integer,; T9 x( l0 y! B* f
                        additionalBlockHeight: Integer,: a; q0 A( s/ q& o" A# f. V, d
                        banker: Program,
& s5 ~/ Z& y4 o  F) n, a, k                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
1 C8 S9 _/ R; Q' g& I! B+ f) }8 z    clause profit(amountBill: Amount, saver: Program) {1 k0 W5 h; \+ C
        verify above(expireBlockHeight)
$ w4 R; v3 `; P) @( R5 ?. S8 W        define sAmountBill: Integer = amountBill/100000000
/ m. K5 e* p3 O/ O2 w9 p- S        define sTotalAmountBill: Integer = totalAmountBill/100000000# A! |$ R& g. d; }) O. G0 [/ }
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain # |% P9 g2 u$ u7 H( I
合约的源代码说明可以具体参考Equity合约介绍.* I4 L/ Z3 ~$ ^4 }" r: `; m
注意事项:
& {: F4 \* a9 r& U# B( H
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产5 `9 v9 u5 r  {! E+ x
    ' Y( g% K% y8 `; k
    编译并实例化合约( s& N6 F7 ~( f" K; I
    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:. Y, N$ a8 b7 L  a
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    # l! O& E6 j% DtotalAmountBill         :100000000008 W4 ~  g- O2 Q; {0 z
    totalAmountCapital      :20000000000
      h5 Y- G; ?* {) HdueBlockHeight          :1070
      s3 C/ Q# U, i, f( e7 s8 LexpireBlockHeight       :1090) R' ^, Z  Q* K9 Z
    additionalBlockHeight   :11003 a$ P6 U2 q7 N+ n
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    2 B- I1 C- d- `' E* rbankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf* v$ U3 {* p! ?, A* X
    其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。' ~2 N6 `  Z: y2 |& g9 l& y
    实例化合约命令如下:: z; Q" Q/ A$ D- M/ @
    // 储蓄合约( j- q. T6 h# B5 U: P
    ./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    + W. Y) n0 L- r# z+ L+ ?5 I7 o// 取现合约7 Y8 f6 w. D3 a$ C; r8 [7 @; O% V
    ./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf5 V+ k& \- c9 F8 r" C; ?
    发布合约交易. R) v, G. H4 \* A
    发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:
    ) P4 |4 x, t0 Z{
    9 j1 W8 ~8 r/ K) s8 h  "base_transaction": null,
    . j# @7 H0 ~8 ~7 n; l  "actions": [4 w' _. [2 ?2 C* ^7 B
        {
      R/ L# _7 \! l  U3 n8 o4 L; q      "account_id": "0ILGLSTC00A02",% @$ A  L9 |' I* M+ a. o, l) s/ X" Q
          "amount": 20000000,' Y; n4 ?" U5 S. s: Y% Y
          "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",, D3 e0 L1 L( \" f; Q$ X  i/ b
          "type": "spend_account"/ q! b1 o. b0 l) Y4 K! p
        },! s. i9 L9 {. R9 ]% c! ]
        {
    0 N! Z8 X: I# F, ^6 }0 T4 \      "account_id": "0ILGLSTC00A02",; G: J9 A' T- {, z
          "amount": 100000000000,
    , c; E* s7 ^  P! V5 e  u      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",) }$ B! T3 P% r7 J' R7 {" ?
          "type": "spend_account"
    & h5 I% R! o! K' n    },1 ?4 R6 \% h7 y! L
        {$ v' t# v' b+ N
          "amount": 100000000000,
    * W$ f$ }  p; ?4 H, `1 ?9 d( {      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    % D! `& B9 Z# h6 z9 a4 z      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
    / k0 v/ N& r# \1 A, R      "type": "control_program"# `7 V0 u% r8 V; `2 n4 `+ z
        }6 Y: _/ w: h* t
      ],: Q; m: V& r' t$ g
      "ttl": 0,$ f3 |3 I8 i# j. v; X; s
      "time_range": 1521625823
    3 Z: v* E4 K3 [8 g* m0 o}& y- N$ u" t. m, k3 ^
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    / r* g) V1 x, I4 l- }7 k此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:+ i, k7 D) ~; o+ |5 \
    // 储蓄合约. |* N: a5 w0 ]2 p
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b32 E) b9 ]: g* [" [' ]
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0, W6 f+ T" i0 Y; p8 l- R
    // 取现合约
    2 b) ~5 e% t2 R1 |2 |assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    $ I, W- G1 [( A6 I$ `, T! Zprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c05 m4 C2 K) R7 m3 o- Q
    本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9