Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
156 0 0
储蓄分红合约简介
) f" }/ E0 O$ e储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
9 T  X9 Q" h, t  p6 J+ }% f( V& G5 N1 s
从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。1 x8 P% m) L7 M8 e+ v% @
合约源代码
6 Q' [. B3 X8 K: a4 Q8 h// 储蓄合约* n8 v4 W- {% Z) z5 s
import "./FixedLimitProfit"
2 I2 o7 U1 W$ R( E$ L) Ucontract FixedLimitCollect(assetDeposited: Asset,
8 L- Q1 I# C8 W* d7 E1 L: @6 V8 \                        totalAmountBill: Amount,/ R% x/ O1 e) k2 Y2 G# @+ M) ^
                        totalAmountCapital: Amount,
) f. d8 s+ V5 m, s3 t                        dueBlockHeight: Integer,
* d9 |  H- }% F  K                        expireBlockHeight: Integer,
8 Q8 f9 S/ b! g9 x                        additionalBlockHeight: Integer,
: S/ I, t5 L; A7 ?! y                        banker: Program,
# G& m+ H8 K3 v/ A                        bankerKey: PublicKey) locks billAmount of billAsset {
$ }1 J6 E$ e2 s8 L6 x7 Q    clause collect(amountDeposited: Amount, saver: Program) {+ |9 l3 V- ]6 j- }6 q1 [" D
        verify below(dueBlockHeight)
# G$ r* d, Q+ ?        verify amountDeposited  0 && sTotalAmountBill > 0' b5 J% V0 i* z. h1 A- R
        if amountDeposited
2 E. u1 S- Q" T+ x& B+ c// 取现合约(本金加利息)2 ?6 k/ y% p* J+ R. g) d
contract FixedLimitProfit(assetBill: Asset,( e% d4 `; W1 Y* g6 {9 `& E2 l
                        totalAmountBill: Amount,
$ l4 W( `8 o1 @. o7 _$ e( h                        totalAmountCapital: Amount,8 I( }* J" t; i. m9 X
                        expireBlockHeight: Integer,* H7 L" s' }: I" D2 X# \( h
                        additionalBlockHeight: Integer,
+ G( @- G# f9 p                        banker: Program,! ?- r% P5 O" W4 ~( Q
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
" f% V1 o* _- V2 L& i; k2 Y' q    clause profit(amountBill: Amount, saver: Program) {
: Q# h$ c" O9 C! o        verify above(expireBlockHeight)
$ v, p- S2 \4 b) _7 H" h" j        define sAmountBill: Integer = amountBill/1000000003 }  \/ e5 ?& M% @
        define sTotalAmountBill: Integer = totalAmountBill/1000000006 ^: Q+ D+ B+ \
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
( p6 V* j) V7 q& w8 f5 _合约的源代码说明可以具体参考Equity合约介绍.
1 b# J4 h; z1 z4 b  G8 {注意事项:1 D3 x5 d8 {/ d2 t2 d9 Q+ l
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    8 W7 `- y) N% }5 m9 ?

    - r& h/ Q2 E; D- A编译并实例化合约
    6 q: m% t$ {% R( i: s编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:6 B" n: N+ y/ W
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    & R5 I; k. [+ stotalAmountBill         :100000000005 b2 p* {3 O- ?8 D; h$ T
    totalAmountCapital      :20000000000
    9 E* K# L1 T7 I3 m7 a7 BdueBlockHeight          :1070, y5 ]4 ]. Z( k4 e- ^' l
    expireBlockHeight       :1090. ?) _7 V4 I) _5 c
    additionalBlockHeight   :1100! G: S  y5 J! y; M) B
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec50 [! t- ~" z5 a1 T5 I+ t8 K
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    " d5 u( W' D  n1 `6 X其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    & ^! r* C- _2 w2 u; z6 H实例化合约命令如下:
    9 W9 j' F' |7 s4 G// 储蓄合约8 Q$ v, [( i# B! @0 u
    ./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
      Y2 ^% `! d$ I! i3 z// 取现合约
    4 ]' ^1 @. e; {3 H! ]./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf4 N$ d0 N4 B4 L+ r
    发布合约交易" j' P$ G# S& A8 D
    发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:$ Q( ], S1 H3 z  m! a
    {
    * W; E  M/ Z  @; B) h* k  "base_transaction": null,
    - P! x+ p( h/ ^9 E  "actions": [
    % l% |5 M5 _# M, y; C9 m  Z    {7 y. ]! W* n8 R2 v# V  ^4 A
          "account_id": "0ILGLSTC00A02",
      X$ g) c% M2 U+ J- U/ r9 Q9 R" Q      "amount": 20000000,9 O! C+ Y! t3 M5 G
          "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    9 [4 l* R. E+ M5 j$ H      "type": "spend_account"
    $ U2 t# ]& d+ D    },
    * Z  ?9 h" e/ Q0 [0 ]8 ~3 S% |    {+ {- P: C! G$ l, h5 ?; F3 s
          "account_id": "0ILGLSTC00A02",
    0 w! q( G; D( T+ O8 j, F      "amount": 100000000000,% C4 X& e0 J5 J4 W
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    * b8 P! `, r( @      "type": "spend_account"
    2 `( r" z& W8 Q8 ^- O1 M9 e' a: L, e    },
    ; \* I0 K. D, Z    {+ W: ]( n9 `8 Z$ y. u3 o* v
          "amount": 100000000000,& \. _. I8 Z5 Y  b9 _
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",* ^% m9 u5 p7 k9 v6 b
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",0 b+ W1 H8 d( o5 x
          "type": "control_program": a7 n/ h' b. I9 d5 g, ]6 Y
        }
    , g; r, R- @, J! v5 W  ],( A% y( ]+ ?/ {. U
      "ttl": 0,
    + O% t9 a! G3 F( \  "time_range": 15216258234 c1 G% ^5 c5 o# o
    }
    $ ?* \" t. E" o4 @" r' q5 t: v; I合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    # M6 O, V+ y# T4 G/ ^+ q  W此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:! L1 F0 F/ _, K
    // 储蓄合约; S5 Q) E: A* ^2 e7 J
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3- ^0 y  e2 b4 X+ m7 ^3 T% {" K
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0
    , e) _) i) t' B! l! S: P// 取现合约9 c4 t+ n, H. n, D
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee& K1 Z) a* d, p# ~" ^
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    5 E4 O% Y' w% ~. g本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9