Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
110 0 0
储蓄分红合约简介" g! z; z4 {5 @" A2 l( a2 h8 @
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
* c% n$ j1 l6 r. s; H; K
, N/ A' R$ h. ^! L1 O/ l从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。/ R0 ?+ m! b8 g5 Q5 g
合约源代码7 n$ k7 _' y8 k+ J1 E0 D! m9 R5 p
// 储蓄合约1 d, z9 P6 ?. Z( l
import "./FixedLimitProfit"
7 z! z1 V- }) s: J" _& hcontract FixedLimitCollect(assetDeposited: Asset,
2 o8 Q( p1 u+ `, M6 z                        totalAmountBill: Amount,) g- }. c. f; P8 N2 c  u. U  g
                        totalAmountCapital: Amount,
5 P( \- w' C' `+ u! Z                        dueBlockHeight: Integer,
3 j( G& ^+ b" N/ r9 x1 t4 h                        expireBlockHeight: Integer,
+ a  A+ G3 ?3 f, d. l+ ]% Q. l                        additionalBlockHeight: Integer,
! T, d0 z: \4 e( K                        banker: Program,
, B2 {& S2 N0 W( c" n                        bankerKey: PublicKey) locks billAmount of billAsset {5 z) h1 X/ [0 ^8 c
    clause collect(amountDeposited: Amount, saver: Program) {
: s( ^( i1 n9 }/ I9 Y  U3 l        verify below(dueBlockHeight)9 [9 {8 R. I) c
        verify amountDeposited  0 && sTotalAmountBill > 0
  `0 b1 k  M+ z9 u, [" s. J        if amountDeposited & d' T& ~/ N4 t/ T5 j
// 取现合约(本金加利息)- Q* n1 ]8 |& R
contract FixedLimitProfit(assetBill: Asset,! o! F, M7 v5 N# E, l' N
                        totalAmountBill: Amount,! P& q, K% |! y2 x. Z" l
                        totalAmountCapital: Amount,
4 J2 y& E( L3 p8 b# L+ y                        expireBlockHeight: Integer,
" k' v! o8 }. c+ g' E                        additionalBlockHeight: Integer,5 R) n9 S% H; u
                        banker: Program,
- Z1 L" H4 ^+ q, q6 E                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
, v+ ?- ]4 Q7 U" }% \- O    clause profit(amountBill: Amount, saver: Program) {
  ^! O" i' M' a% X9 v4 H2 X1 h        verify above(expireBlockHeight)* p6 E6 V: [. k! Q) }. A8 Y
        define sAmountBill: Integer = amountBill/100000000
+ a( |) e, J* N' g+ u        define sTotalAmountBill: Integer = totalAmountBill/1000000008 K: N7 w: u$ U
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain ) s, ?5 K" K% ^2 h+ z$ z
合约的源代码说明可以具体参考Equity合约介绍.
  G8 b$ X1 |  N% m注意事项:8 `1 Y" `2 h" A9 O$ Q4 D
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产% e3 L6 @* f  o- k" m7 \# g5 h7 S
    + T6 x- D: v' m* M  _0 r, y3 S
    编译并实例化合约9 S6 @; c: a$ `% ?  m, ~* M8 N
    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:
    2 Z0 l7 J! l" k- e" MassetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4 q1 V& v, p* g/ X2 D; G
    totalAmountBill         :100000000005 A3 I' i5 J5 s
    totalAmountCapital      :20000000000
    + W: a; _8 w8 A5 t5 I: z" P: {, WdueBlockHeight          :10703 ?4 z" \: c/ F6 k! e
    expireBlockHeight       :1090
    : g8 W0 Z6 a% ~* ?7 v, IadditionalBlockHeight   :1100
    . r  ^9 A5 G5 Hbanker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    6 t2 J, {2 Q' B% M! u/ rbankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
      P4 J$ F& S7 U( B$ B0 S; H其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。/ i% F' r0 k9 Q
    实例化合约命令如下:& k; s# o! E( Z# V; U
    // 储蓄合约
    9 g* A# R0 k; c; S7 E5 s8 J./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf+ x, y1 l* |, H/ f; ~. I
    // 取现合约
    3 y1 k9 O) x3 Q' \! F! s' v./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    & m5 T+ ]9 s9 `: j7 |) j( N发布合约交易
    : g4 z2 [4 t" ?0 ]8 `" _5 S发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:
    " S) k) M  L! h8 x, q{2 s% Q2 _7 k- j( b* n0 W! }% ?5 Z
      "base_transaction": null,: \2 R6 x! ~  y" B: h, o9 x5 |
      "actions": [7 d. v- ^$ W8 }" u: H8 g! ]
        {
    : {9 X: T" A$ z: I5 G6 h( |5 A9 J      "account_id": "0ILGLSTC00A02",
    ' t' T1 k: d/ t# R      "amount": 20000000,
    $ P, Q, w2 b+ ^      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    ! i' i3 c  {6 C& V* t      "type": "spend_account"3 x5 L( d6 A0 C" o7 b7 p9 `
        },
    % B8 |4 o& q* B3 r4 g' f/ C# P7 f    {
    5 ^% e/ }, B, S, z+ z      "account_id": "0ILGLSTC00A02",4 [: o5 `+ e9 M' Y8 p, ]" i
          "amount": 100000000000,1 o% i; I) ]) r. U
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    1 H; ]" M: k/ Z! ~8 o      "type": "spend_account"  `. ]! h4 T$ b5 N5 _, N7 Q4 }
        },
    4 n! e$ R0 f  P$ U- S    {8 v+ {# ^  o7 [+ y5 o
          "amount": 100000000000," w0 P: c( ?( Y4 @6 _7 b
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",+ D5 L) H' X& m0 H
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
    * R! U6 R, g7 Q' J4 w      "type": "control_program"8 q# j' b' t) ^$ U" ~3 ?. a& j8 E$ l
        }
    2 R: d$ A/ u. M2 w5 q  ],
    & v# J( w. _8 s& h  "ttl": 0,: V) h5 U$ B5 u7 y$ s) R
      "time_range": 1521625823
    ) E' w) u2 d' o( q, i. z/ m% j3 P}: p% A$ q! @2 n0 ]  U  B+ B/ E
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    . [7 s0 _* N- [6 p% `4 w" _此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:1 g) p2 u9 F6 c0 N; x) R3 v
    // 储蓄合约
    6 h6 E/ |" r3 U0 q# u1 C; AassetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3
      w  L" A  C6 }' v% ~  l( Zprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0# A6 i+ V$ L0 q- V( r
    // 取现合约
    ( d, I, p" o1 g0 [8 t/ xassetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee  Q! d! G. ?' [2 N8 F* z5 a( y: o5 B3 a
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c04 y  e; \9 E8 ?; |0 H
    本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9