Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
157 0 0
储蓄分红合约简介- K& |0 U( j- C  o
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:$ v. j, {0 P" d7 e  |% [6 A

( M$ |8 K0 I( Y) R3 ~& T" i9 D8 _从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。
! }/ O7 l/ L# v. e$ [; h合约源代码
$ v2 O& P$ |) O" }. N2 e// 储蓄合约5 M6 K9 ]) T: f8 `, M
import "./FixedLimitProfit"9 H& f7 Z& Y8 T' p& i9 c' q4 ?
contract FixedLimitCollect(assetDeposited: Asset,
! i; j/ w9 n$ N& r                        totalAmountBill: Amount,( K5 M! l( x( ], `
                        totalAmountCapital: Amount,
- k6 X% Q1 S. a4 C                        dueBlockHeight: Integer,# j9 u$ p. [1 |  n( a+ T
                        expireBlockHeight: Integer,& v* B7 U5 r3 Z6 z; M! U- {% n% V
                        additionalBlockHeight: Integer," `8 T3 M- q: G/ I
                        banker: Program,* p( s2 [6 E" I+ c+ K
                        bankerKey: PublicKey) locks billAmount of billAsset {
3 S7 h; l' }! [    clause collect(amountDeposited: Amount, saver: Program) {
' B5 a) h. |6 t( _. C2 u1 ^        verify below(dueBlockHeight)
. [' u' l# [* `        verify amountDeposited  0 && sTotalAmountBill > 07 Y/ t2 ^4 \% v7 D& F% x  h
        if amountDeposited
8 A" z: k$ k  d  \# E5 U// 取现合约(本金加利息)( _9 x' ^3 J- U; ?- ]
contract FixedLimitProfit(assetBill: Asset,: _$ i) x* ?) B3 M$ N/ B* D
                        totalAmountBill: Amount,
: @. v  O# u! i. B; E3 G0 |1 f                        totalAmountCapital: Amount,
/ r; t. b) C. x! D$ `* R                        expireBlockHeight: Integer,
/ H" c4 S. a8 U% g  S7 F+ G" L                        additionalBlockHeight: Integer,
- Y: R3 M0 W% V2 o. D1 [                        banker: Program,( f2 Z2 [& f  H% M% \# s& s
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
/ ~1 Y( q: a& O3 y( y    clause profit(amountBill: Amount, saver: Program) {
3 y9 m0 N7 _+ w# w        verify above(expireBlockHeight)( k" O" Z  s4 M8 s; ~
        define sAmountBill: Integer = amountBill/100000000! p. b5 ~/ h/ @% N0 i; E4 E
        define sTotalAmountBill: Integer = totalAmountBill/1000000006 w; c' Y, {0 M  A- T+ C
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
3 C/ ?# L$ E* f% [3 h合约的源代码说明可以具体参考Equity合约介绍.
! _! r5 O3 T) c9 C* g3 R. N注意事项:
4 P7 c, z" N; }" @+ r
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    % i. c0 ]$ {4 x) B9 _% d3 \

    ) h+ T/ H- b& z) M8 R编译并实例化合约) U! l3 Y7 e. V6 H
    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:0 Y) l6 o) j* Q4 q
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    ' ~  K) i- b$ M$ I) }  Q. W- XtotalAmountBill         :10000000000
    + n6 g5 x. Y" c6 V" O4 LtotalAmountCapital      :20000000000
    7 r0 g3 ?7 o# V+ a3 F6 o4 EdueBlockHeight          :10709 i! l1 V% C6 A. i! C6 t6 k
    expireBlockHeight       :1090
    5 I0 m' D; z0 Q# p7 XadditionalBlockHeight   :1100% ^- C4 z( O% G" i2 T8 b, ?6 X/ `1 Y
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec50 l1 C7 R7 m' O# O
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf0 g6 V5 E% p8 [( o7 Y
    其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    $ J6 j% r* M, p- E实例化合约命令如下:
    % }/ e- a" F, d8 G8 x1 z) m// 储蓄合约
    # Q5 Y' w' i' g' u# y8 C9 N./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
      |( T  P+ f8 c8 _& S9 k// 取现合约
    + U& x( [$ k0 V# @8 l: a./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    $ K* ^) {* D+ j& X发布合约交易
    : }2 j  ?1 n( H. P) f' O  ]' w发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:9 o1 H& _& I. A+ w) b1 \
    {
    ' c+ a. j( l  V  `- Y  "base_transaction": null,1 x3 |# ~6 W  \" u
      "actions": [4 k6 j$ n( N) T
        {
    1 t. d3 `4 J1 G# Y( C. k+ b/ c      "account_id": "0ILGLSTC00A02",, W; o* n( T8 h! @
          "amount": 20000000,
    0 B* C2 R% v5 Q" q, t& R; H      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    ' Y2 O2 m! T" Q" r) n      "type": "spend_account"
    4 i  {4 s0 Q/ E# [  |- u& r  a    },
    9 Q0 g, L+ P1 [" y* J1 t    {
    : o5 K! c7 x) L+ q" [  a      "account_id": "0ILGLSTC00A02",2 r" }+ H! I2 R# f( R/ J7 U
          "amount": 100000000000,
    0 ?! a# c7 m% c      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",5 ^$ G8 V: D- I
          "type": "spend_account"3 H" i  a0 y0 j4 h+ X) `
        },& n* v, {$ q' C0 i+ ?
        {% a9 m/ s1 @7 L- r
          "amount": 100000000000,1 T- F1 s7 n9 c) f' w, J4 r5 u
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
      [0 x; B9 Y; Q      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
    ' Y' X4 d' l1 x      "type": "control_program"0 x5 c4 C, s" _$ w( l6 V9 F
        }
    1 g6 @0 _5 {+ h, l  ],, R2 m  J8 H; j) y
      "ttl": 0,1 t6 T- _$ X* ^9 x# E
      "time_range": 1521625823
    9 G' R# D- D% B+ u}
    ; ]/ }5 S- S. _; ^/ @- d1 x* `6 i# A合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    . J8 m0 a% j5 n此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:
    0 m( }5 ?' `; f% Y0 V0 N// 储蓄合约
    8 @- ]2 x# x5 a8 C; K0 IassetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b31 S1 z& q$ q' p% [; g1 x0 @4 k, J
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0: y) J! @' B3 \! T/ j1 i3 ?. s
    // 取现合约' y! t8 _' _/ P/ B+ N
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee, J6 \. g$ N( Y5 |  A
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c09 t! [& ^* \% n
    本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9