Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
86 0 0
储蓄分红合约简介7 r4 o0 B1 K5 N
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:" Z+ g* w/ D8 z& b7 _2 K

) U- j5 ?' m( F从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。& f3 m( `, r2 Y
合约源代码
) M1 e0 K  `1 u% ^) f// 储蓄合约
7 H5 N/ |+ f3 P( Z. H) Mimport "./FixedLimitProfit"
3 @0 ~6 j% x6 y$ f2 r/ I* f$ E9 Hcontract FixedLimitCollect(assetDeposited: Asset,
7 F5 n) g4 v5 B: o% |; C                        totalAmountBill: Amount,
; g6 j. N4 u$ Q% w$ M                        totalAmountCapital: Amount,# d1 {5 v- _1 h4 n: D' N, K, U
                        dueBlockHeight: Integer,
- Q! [1 [8 Z& P                        expireBlockHeight: Integer,
) k/ B% P3 j* Y: V2 {% v                        additionalBlockHeight: Integer,
/ w) N4 d' x4 y- p                        banker: Program,# X3 B4 p8 }- L3 ^1 N2 k9 f
                        bankerKey: PublicKey) locks billAmount of billAsset {" b  b8 y3 `5 D% L, c
    clause collect(amountDeposited: Amount, saver: Program) {+ i1 f% l" X" v: l5 \
        verify below(dueBlockHeight)
2 P- ], W4 u( Y        verify amountDeposited  0 && sTotalAmountBill > 0$ z% ^8 Z# J% _4 F9 g1 C
        if amountDeposited
- r7 J$ c" L% j- R4 b! o// 取现合约(本金加利息)
; C( a& I, A  O7 Z! [( F+ econtract FixedLimitProfit(assetBill: Asset,$ D0 I# c  \' n- j  H9 X+ s
                        totalAmountBill: Amount,
' }9 O9 V7 k# M  X, Y) k                        totalAmountCapital: Amount,
$ W, C8 A3 e0 n- a$ P) \5 I                        expireBlockHeight: Integer,( m5 ]7 w0 G0 m; @# v$ C
                        additionalBlockHeight: Integer,, m+ Q# {- ]% I" Z2 n
                        banker: Program,+ v' {1 t. q  I% M6 H: B: ~
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {1 [( v* R5 u' i+ b4 V8 |) a% ?4 F
    clause profit(amountBill: Amount, saver: Program) {6 K8 p. T/ B6 _: Q9 o6 }, M
        verify above(expireBlockHeight)& F3 O3 v% m- v0 ?8 {5 T
        define sAmountBill: Integer = amountBill/1000000008 d7 W% `- j# P& n6 L+ B, z
        define sTotalAmountBill: Integer = totalAmountBill/100000000
7 c& S7 d6 o6 ?- o        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
9 E" V9 q: n1 g( v9 w: T+ p合约的源代码说明可以具体参考Equity合约介绍.
# }) `9 y, f! |: k+ B' ]& P& R/ R. O注意事项:  T- h$ A2 b. _" u
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产, K! c" V( |: B9 }* r% d
    4 C# T2 W1 z6 X+ u( w! [6 x
    编译并实例化合约
    5 Z5 x& |4 d; R- @编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:2 c* g- v' |8 C# K
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee; r' b/ `- s1 I7 W
    totalAmountBill         :10000000000
    & }+ y( H5 `# O9 T. ttotalAmountCapital      :20000000000" D9 ^0 H# \; Q1 }; e+ T4 _6 r
    dueBlockHeight          :1070
    " L) f( h5 e' D; I+ ZexpireBlockHeight       :10906 l4 K1 E0 l5 P) B0 `. U
    additionalBlockHeight   :1100
    5 ?* G7 ~! x! Q2 kbanker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    % r& y0 N- e( C  k) l: `6 M; KbankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    2 b7 Q8 T( B7 m+ I' F其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。# F* a; N- d8 A; Q: T
    实例化合约命令如下:
    . |- ^: Q& Z$ a* n1 v  ?5 u$ P// 储蓄合约& i: c; p( i6 r" G* _: ]
    ./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    ! \) p! j7 O! q// 取现合约( ^, ?2 G0 w" e0 ~, {
    ./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf6 \# U- B( J1 c# c: }, z
    发布合约交易
    # ^& J) P) P+ m2 g; ~% w$ F发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:$ z5 V6 o; q4 R* a7 U: L- P9 ^! I2 w
    {3 i# l* g( N$ C: d; l
      "base_transaction": null,& }( I2 s3 ~8 P$ `% e! E
      "actions": [
    0 _& d, H8 _# @    {( l! F/ X7 \% K# X0 h7 b
          "account_id": "0ILGLSTC00A02",
    - k* l7 Q9 j/ k5 O8 C8 E      "amount": 20000000,
    0 H4 n" [5 z) t3 }0 C7 }- i      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    , W+ `# x* n1 a' F( ?8 g* @5 S& C      "type": "spend_account"
    $ E! v0 d7 C/ a9 G: D6 U    },
    4 s7 A. p8 P# v    {% ~8 z$ o7 R/ a" N; g* M" u: U
          "account_id": "0ILGLSTC00A02",
    4 K$ v9 Y7 [5 N1 E$ e8 w9 v      "amount": 100000000000,
    * R  P% G" m4 c4 i2 z  R4 T      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    ! v# _  b) o+ i# E      "type": "spend_account"
    ! O9 P- C, u3 r, s" V3 N    },
    ' H% c! J6 n9 m; h5 ]    {
    " u- v0 p* [5 \8 H) R, T, q4 s4 V      "amount": 100000000000,9 X% Y! h; ~% f( Q( u
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",$ n: C6 }" j/ U7 X: O5 ~8 F
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",& }! V+ h5 O( K8 v. F( G% H# V
          "type": "control_program"
    * A) z  I9 t) Y# ~( D9 B8 j    }
    - K8 m2 x3 z+ \. i0 J3 g0 X  ],, W$ }* I( ]  ^4 V3 ?" Y' E/ a5 c
      "ttl": 0,
    ( |5 X* e8 u) x& d* O5 Z6 B) v2 w  "time_range": 1521625823) Q2 j1 m7 ]5 l" t. V
    }% @! ?/ p# Y- N* e3 l' d6 x
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    & t* ~4 @4 {/ L! b! H此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:
    * G! {& n# z% t) N% y- q// 储蓄合约9 m6 }# a2 ~3 ~
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3) C. `( Y  j7 u, U$ K$ M
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0: c2 Q5 w9 B6 }; s! k& R& X) N
    // 取现合约4 o$ g) I* f6 d5 f& o$ N/ v: S# P7 d
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee/ t6 U; W8 w# {. Q- K; H
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c07 n% j; u$ K# r- x
    本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9