Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
85 0 0
储蓄分红合约简介
  K0 l  U# t& |8 @, Z0 U储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
7 }2 I/ K0 N& Z( Y! l
  N- }4 F: f9 q+ e( V+ V  y6 m8 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需要再构造一笔交易来提现。
2 t( A* S1 q* [! x, Q: j' q" B合约源代码+ k8 ^( z( h+ q1 H) D0 A
// 储蓄合约
5 f* E6 H' z, v* ~# r$ g+ ?import "./FixedLimitProfit"
0 n6 t) ~/ y+ }contract FixedLimitCollect(assetDeposited: Asset,5 }% }( h2 u! @9 @
                        totalAmountBill: Amount,5 @2 u: p% v" b: y2 i
                        totalAmountCapital: Amount,
" }2 j' O/ a8 W5 E% j5 \& N. K                        dueBlockHeight: Integer,
1 V1 Z5 ^; Q/ `) L$ G1 t3 P                        expireBlockHeight: Integer,
7 D- `( X8 q) m$ x8 q                        additionalBlockHeight: Integer,
* C+ w  g1 M: g8 C- I+ l                        banker: Program,
! l: g6 Y+ M7 m3 y                        bankerKey: PublicKey) locks billAmount of billAsset {
/ [- {9 j' Y- ]% ~/ q; W+ |9 c    clause collect(amountDeposited: Amount, saver: Program) {4 g$ ]& j1 w, K4 @$ h4 b. y% _5 |: e
        verify below(dueBlockHeight)
! i( o$ K: M! ?2 j        verify amountDeposited  0 && sTotalAmountBill > 0
3 u) D  v9 m' G1 Q! t' |2 n        if amountDeposited
* i  n- X- F; `* }// 取现合约(本金加利息)/ T% v2 V" B4 y6 Z
contract FixedLimitProfit(assetBill: Asset,
  L- w' F" c: y6 C9 P4 x) Z# X5 e                        totalAmountBill: Amount,
' e3 ?/ }: C6 g2 q' I! u! z2 L                        totalAmountCapital: Amount,& ^! c2 M0 K5 g6 O  v1 [
                        expireBlockHeight: Integer,- v4 {  G+ t) U- P
                        additionalBlockHeight: Integer,
) w6 n8 f/ a" n1 L. n                        banker: Program," m. p: N7 D  Q, @
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
/ b) S4 k9 u& a/ y    clause profit(amountBill: Amount, saver: Program) {
9 h' K; |! J7 a1 D- }& A/ U- h        verify above(expireBlockHeight)) z) o: z& b8 v' J0 o  L' [
        define sAmountBill: Integer = amountBill/1000000001 H# s# I. o# Y5 G8 d
        define sTotalAmountBill: Integer = totalAmountBill/1000000000 x- ?5 n& L: y) ?4 u" \+ a6 f4 p
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
* K8 G* L+ E5 x+ n9 T6 m合约的源代码说明可以具体参考Equity合约介绍.
3 t5 c4 k1 x4 Y+ g& E( |' I7 j注意事项:
1 T# _2 f+ ]' O% M! Z' `: L' o0 a
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产/ w6 M( l5 y0 i4 _2 A- Y4 d, B

    , r" B. W5 l( K0 M编译并实例化合约/ C" Z) T! G5 x* W
    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:
    5 ?. p- ]  u2 @  M# u  W7 K$ Q7 l& |assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee$ b* X2 @# ]6 L) J( }
    totalAmountBill         :10000000000* U9 M& M1 Y$ m* A6 N% C5 U% H
    totalAmountCapital      :20000000000
    : l# b, [: \- C* H3 V8 O5 M" A1 NdueBlockHeight          :10706 N& ~1 T3 l, G8 C  c' n& Q
    expireBlockHeight       :10902 R6 ^9 S4 F7 `  q
    additionalBlockHeight   :11004 V6 L& v1 d# R. l1 s! i% G
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    # w- ?4 R7 E% Y/ O- ]) c. XbankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf# ^1 U0 L$ N0 f) T' g
    其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    ' M2 R/ d+ u0 K* P9 Y实例化合约命令如下:; @- X! U/ K6 F
    // 储蓄合约
    # f1 v& i0 N. m) F/ l5 C4 G./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    % S) z8 J, t7 K// 取现合约
    0 o1 ~9 V4 h$ x& w' W./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    % e, S7 j6 N3 {) I6 X. V" [: q发布合约交易
    ) Y: s4 \0 k# v7 V发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:6 Y+ c$ P) W8 q, }( o- V
    {+ t8 C8 h0 m; ~- [! |6 W, T9 p* R
      "base_transaction": null,
    * a) a. P4 x$ U* ~  "actions": [( T9 F  }2 I+ M4 @
        {7 M' u) ]3 e4 v, ^3 v; u
          "account_id": "0ILGLSTC00A02",
    / ]0 A4 `( E' B8 P& T      "amount": 20000000,
      j2 y! H4 C8 j; j1 ?      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",+ t. f# h6 T9 N' X  t4 ]4 A  c% I
          "type": "spend_account"
    1 L1 u/ B- W+ f/ w7 K. A: |3 N* ~2 |! y    },
    ' f+ G& W. ]: q, Y1 p% E    {
    ' {0 p( ?0 ]# h, W. U9 V4 G; ^      "account_id": "0ILGLSTC00A02",
    ! ^! B4 ]& T3 Z& z      "amount": 100000000000,
    $ c4 d# L' {3 X. h      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    , i' G' y5 T% y# O+ Z7 U( H      "type": "spend_account"
    ; d( d3 Z1 T! s* t    },) Z$ Q& w$ ^' o% I! e  |; h
        {
    5 G& M6 w; j$ B$ K6 Q$ h) d  ?      "amount": 100000000000,
    + O1 ?8 N& w  G0 T      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    # O; m1 C6 h3 [& i& N      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
    4 \: Y, a- h  J  X! J, T8 A      "type": "control_program"( ~0 W$ V5 g! q. p
        }- K; q- n% @, I0 L
      ],
    : i- F8 b. u, K9 N- [! d  "ttl": 0,1 q% D- L, ^7 g6 ~9 ~
      "time_range": 1521625823- w$ S' v) G: g7 O
    }6 r. \0 e9 _- Y7 \
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    3 W  N& E, Q( ?此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:9 n  d0 c! x& `: k4 v! u
    // 储蓄合约! C$ M1 I2 X$ M! J, V( \
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3/ m$ t' K4 X! d8 {" A1 d
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0- K5 c. S' e" f$ A: p/ O3 M  w
    // 取现合约- O& y; o. C+ L- }1 ?1 a# E. f) A
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    9 G- K" f$ i7 g+ Mprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    3 M4 m6 S! D0 x0 o$ ~  j本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9