Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
87 0 0
储蓄分红合约简介$ }6 e0 {% G, v- t/ w
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
% `3 g$ a( d4 u; O  r5 K8 a- W) N4 U% I+ c: u8 z
从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。' h! B: y" {% u8 q1 T/ ?' h% w& E* C
合约源代码4 X. ^6 q$ {4 @% f( y, ?1 r
// 储蓄合约  s  z9 G+ a. [+ ]9 K+ I
import "./FixedLimitProfit"8 w5 C9 }+ }6 l, S0 I
contract FixedLimitCollect(assetDeposited: Asset,
- t1 p" T# e+ s8 F; k: o7 \) _2 i                        totalAmountBill: Amount,& S! l$ I: r, b" f
                        totalAmountCapital: Amount,: _8 e! v- s9 c/ M0 B
                        dueBlockHeight: Integer,- ?; _* v* W9 g; W7 X- b. ^; C3 r
                        expireBlockHeight: Integer,  [  M$ R1 O$ U1 Y# e$ `
                        additionalBlockHeight: Integer,
+ y' F$ \: i, b: n& i                        banker: Program,
, f# G' Q# {; @8 V& g7 U                        bankerKey: PublicKey) locks billAmount of billAsset {  M" E- t6 e% u  s
    clause collect(amountDeposited: Amount, saver: Program) {7 s$ L! M$ w( }$ z4 u2 i
        verify below(dueBlockHeight)
* r+ E  K9 E/ m4 P+ c; ?0 R8 }        verify amountDeposited  0 && sTotalAmountBill > 00 {4 U' U" u( T+ D$ I9 r, }
        if amountDeposited
# Q4 a1 d9 N7 A1 B// 取现合约(本金加利息)
+ {7 Z% D8 N, t! I5 Z0 Icontract FixedLimitProfit(assetBill: Asset,
# F- u1 T* d7 q) O  i9 C7 k  U                        totalAmountBill: Amount,
8 r: D# A0 `9 P" A- [                        totalAmountCapital: Amount,
9 T6 a0 w7 j. b! i: e/ K' ?% Y% \. ^                        expireBlockHeight: Integer,
4 L9 h6 U- W) q8 Q                        additionalBlockHeight: Integer," ]/ F$ P& B- _
                        banker: Program,+ c  }" k* I: ?$ \3 V3 s; n; _
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {6 b4 k2 W: V. ~6 ]/ J9 Y: L1 p
    clause profit(amountBill: Amount, saver: Program) {
8 b6 o( s9 {5 N4 _* y        verify above(expireBlockHeight)5 N& q3 n$ l8 r
        define sAmountBill: Integer = amountBill/100000000/ ^0 E# d2 V# d% j
        define sTotalAmountBill: Integer = totalAmountBill/100000000
+ S- H1 |; k7 S) G+ b' h        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
1 R( @4 z. [( @% E合约的源代码说明可以具体参考Equity合约介绍.
% {2 r+ }9 b. l! W注意事项:
+ P5 F; M7 t6 E5 R' ^0 e9 P
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    0 v. O6 ^& Z3 ]( ~

    / m5 w" E+ L9 _编译并实例化合约
    * n' l$ U# z( W编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:* b7 D( S% [7 d8 v; s  w1 C
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee: w' \4 |' H5 W3 g
    totalAmountBill         :100000000007 w1 O! q  t+ O
    totalAmountCapital      :200000000005 M( l6 m+ s* p& ~! o
    dueBlockHeight          :1070+ B$ G% H4 [  {. Q: i( s
    expireBlockHeight       :1090
    7 ^& D& \/ m1 r7 u# {$ \additionalBlockHeight   :1100& L& s5 P% E- g5 X& @$ U
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    ( ~+ N( v% `7 R$ [  H1 dbankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    / l$ [# G6 V1 h  b% o其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    ( [! U+ R( r# n) b1 D: n: ?实例化合约命令如下:
    * Q( Y7 \3 [' q7 x) R8 _// 储蓄合约5 J: \8 W+ T& a( v
    ./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    9 E' F( X- o& z1 n; a// 取现合约# }3 X5 L3 v3 Q$ }3 J& x0 x
    ./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    . p+ ?* [9 }( i7 n发布合约交易
    ) P# f, n0 ~4 p$ A+ J发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:
    % s- Y# I: Y' `2 {" w{. |& b0 _$ b$ V  |
      "base_transaction": null,
    ) p: j' }7 P9 o4 I  "actions": [
    ( a  s$ z  Q% O$ U8 z    {
    4 B' [6 N4 f( B. P% H      "account_id": "0ILGLSTC00A02",. I% a9 Y9 \; F2 @3 D0 q
          "amount": 20000000,) M1 K# n) c" \# J; Q7 z
          "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",) z9 y9 m8 u, I5 W8 C* U' F
          "type": "spend_account"
    . j! w# v( r* s. a# w8 [$ B    },
    5 j" o3 r. _+ k$ b    {
    : H% `- o1 |% a6 g      "account_id": "0ILGLSTC00A02",
    , k* \$ o$ \% `+ b  a; c      "amount": 100000000000,
    / L' k" Y  p5 ?) P      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",4 S) h5 }) D' W  }% q' L
          "type": "spend_account"
    ' }6 F# n2 ?9 {2 \    },
    ) I4 |( p) S$ {& z, A3 z8 _) C    {/ L& D# x, J% Z
          "amount": 100000000000,
    2 @- W1 M. z" t2 B) p      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    7 Y* Q  H# }3 f8 g      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",6 ]9 p4 K) U; x# \" q# {
          "type": "control_program"
    $ ~' \4 F6 T# O    }3 x( q7 b- ~. e6 w. I
      ],
    : t5 m0 }5 `0 p( m  "ttl": 0,1 e4 f2 [4 V0 w6 W+ y- h8 K6 Z5 o5 p$ c
      "time_range": 1521625823
    - _* Z$ L, O' c/ H! s' G; P}
    2 I; |& F7 v1 {+ Y5 ]2 ]合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。) C$ U9 _* _+ s
    此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:
    * G. k. T  m& e2 s; h// 储蓄合约
    6 _& z+ F5 w9 X8 a  ]assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3
    # S2 g& {- C# j. Dprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c00 H* f  B: E" [7 i; P) n
    // 取现合约0 n5 B' i7 f# X: ^: ~
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    / {7 f; R  f: M1 Q) lprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    ! Q/ F& w# M/ t; \; H2 b7 z( ?本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9