Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
90 0 0
储蓄分红合约简介  E4 x: |6 t+ |2 f$ o0 ^4 d* z
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
, k# p4 j% m% C4 m+ c! B4 p; J
; q8 F0 q3 o  c  b6 `: o+ T6 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需要再构造一笔交易来提现。
4 K' e0 p, A% z* R, l合约源代码& u! {, P7 @/ `3 r
// 储蓄合约. A, p, z! U, v- a1 T+ M. Z: c9 n. t
import "./FixedLimitProfit"
- @' n: R( [4 E' C" U, i2 \! y( Ocontract FixedLimitCollect(assetDeposited: Asset,
) L: b$ H5 V1 c7 N5 ~" r+ N                        totalAmountBill: Amount,. X* m/ C% J" c0 J7 \, d5 ?; ?
                        totalAmountCapital: Amount,
! E/ @6 _* v; I3 a  F; V                        dueBlockHeight: Integer,) J7 E2 W0 C& _9 l& ~; s, F
                        expireBlockHeight: Integer,& d7 b3 t; R5 M" U1 R* B6 A& J
                        additionalBlockHeight: Integer,4 ]+ r) Q7 h, e  A' G
                        banker: Program,5 a. `" t8 m9 T; n- X' i" j
                        bankerKey: PublicKey) locks billAmount of billAsset {8 o. a6 |2 f- i% E" B* S0 M
    clause collect(amountDeposited: Amount, saver: Program) {/ o6 |. F% i3 V8 H8 v8 Z7 N
        verify below(dueBlockHeight)
& Y* T6 K: v5 r1 U* l% [8 _' }        verify amountDeposited  0 && sTotalAmountBill > 0
4 `4 P6 q  j& ~. d7 e        if amountDeposited 6 n6 m1 p+ s( H' r* j: j+ O! ]
// 取现合约(本金加利息)/ h, x. @! O" R. k
contract FixedLimitProfit(assetBill: Asset,% K- k% v' y* t% t& q
                        totalAmountBill: Amount,- T( D; }1 Q, |' s, _' v
                        totalAmountCapital: Amount,1 [2 t7 m4 G. g: w; B
                        expireBlockHeight: Integer,! |+ P8 @- `8 l/ p7 z2 K$ X. T
                        additionalBlockHeight: Integer,: D# }* o1 Y& H1 e4 W9 z
                        banker: Program,
. B+ X7 \5 H8 V# ^( h) _                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {0 z% ]' Z4 ^( n+ w
    clause profit(amountBill: Amount, saver: Program) {
' Q7 T  \$ f4 `  I6 {3 h$ y) `        verify above(expireBlockHeight)
; l! C+ [1 C% x$ y) J, [; @        define sAmountBill: Integer = amountBill/100000000
0 N8 E' `% Q& f/ k' D        define sTotalAmountBill: Integer = totalAmountBill/100000000# v, y" w, U$ r5 p" _% L' M* \
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain ' B  j/ b8 ]9 H- E& D" G
合约的源代码说明可以具体参考Equity合约介绍.
5 {" s2 y5 u7 o注意事项:
& ]7 q$ Z5 w  n" k
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    5 f& P# E' ?3 Z: T3 C: R3 h9 P
    ) c0 z* S7 v) ^* L; ]
    编译并实例化合约
    % N1 v. D& i0 d0 `- S* I编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:
    # f# j9 l4 d/ J- A0 {3 G, iassetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    : h* j+ z$ t# }totalAmountBill         :10000000000
    9 P1 \6 S* z+ I- R8 \( V6 \' Z3 vtotalAmountCapital      :20000000000' x; m- d' T+ @2 c4 B
    dueBlockHeight          :1070
    & F. O! S" F7 ]8 uexpireBlockHeight       :1090+ y4 }/ r& M' G4 R$ u
    additionalBlockHeight   :1100
    $ \1 |" X8 c( f$ _3 e# O# }  Ibanker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    8 @4 n+ V6 ^% K7 B6 sbankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf# I" Z7 h9 ^. o
    其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    ! H3 R5 C* _% {0 m, R: ]  x4 ^实例化合约命令如下:
    ! X9 ]1 D1 z. Q7 l// 储蓄合约
    ' C" f  I" z3 e: T: |' C./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    # u  {  A/ M. ?" d5 {// 取现合约
    % D+ s6 ^- q" b0 d+ n./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    # f1 b" t  h- t' Q发布合约交易
    $ ~8 x! R  N+ Y8 ~6 T9 U发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:. n7 Z8 P! P8 k' ?
    {1 J" R! p5 r8 p7 X
      "base_transaction": null,# a; ?" P4 W" r
      "actions": [: [9 D1 m2 s! ?9 z, Z
        {
    : v9 C- ^# k! w& ^, |* n" Y" o! A# Y% }      "account_id": "0ILGLSTC00A02",2 ]& V! S" s3 m2 e9 K
          "amount": 20000000,. k8 K3 V& Q% Z' n" H& O
          "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    4 a. g6 C2 o, I: o2 G# _      "type": "spend_account"1 p+ d' t5 d/ N5 X8 Z
        },
    2 m; W, m- L& p7 W0 [4 G6 u0 d9 G& _    {
    1 g* v5 v% B/ s1 g, x9 \      "account_id": "0ILGLSTC00A02",
    - P4 i! g+ S8 i1 B8 P1 Q      "amount": 100000000000,
    : B+ e; {( j6 u' d+ J% P* _1 J% \" N9 K      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    - p- V. Z0 A% ]  L1 A      "type": "spend_account". p- R5 _1 ^: B$ o  ^" \5 h1 {# Q
        },
    ( i( S4 W+ o  d1 [! |    {- R# B3 B& s8 i$ z
          "amount": 100000000000,
    4 p# F6 D; I; g5 O8 V- w      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",. T$ ^' i; U( P3 P+ E
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",9 l3 u# F1 k) w- r9 C
          "type": "control_program"7 n* g+ X5 j2 L5 _
        }
    ! a- z1 T, ?; b4 Q% r: \  ],0 P. q$ @& I4 ]0 p0 Z
      "ttl": 0,
    , t* M, `0 R6 u) N0 d  "time_range": 1521625823# w# g; _5 N$ D8 T2 v7 G" B6 R6 q
    }  y) y" U( M: R/ Y% P6 ~5 A
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。$ m. B  m: \- A5 S
    此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:0 ^& L. v* ^3 c  J
    // 储蓄合约' b7 M# Q* L, g+ @% _
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b39 h$ a) N4 T' N1 [' U8 v9 Y
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0& P( Q0 E" C# Q; t# C
    // 取现合约+ M  x4 F: N) `' f- Y
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4 S* c4 K8 @) N  _
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0& ^3 D2 y+ c( T0 Z
    本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9