Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
163 0 0
储蓄分红合约简介
5 @6 A7 k0 D% H1 _5 n+ O6 V3 f储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:  r9 B' G4 f6 I8 k
/ q2 r1 {: \$ 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需要再构造一笔交易来提现。
7 ~2 Y2 j3 e/ ]8 a7 u合约源代码& b9 T: H- E( Q. D* r
// 储蓄合约
; Q/ x# z' f  ?0 u6 w1 C: iimport "./FixedLimitProfit"
. y+ D3 R$ ~& q* f5 M+ ]contract FixedLimitCollect(assetDeposited: Asset,6 M2 G! s: z- x; N
                        totalAmountBill: Amount,
3 b" q1 {, X& F* X5 k- Q5 ]  W                        totalAmountCapital: Amount,
2 J. D/ h* c" A7 n; [$ q                        dueBlockHeight: Integer,% B0 W( K+ E8 Q. N, Y: L& O7 k
                        expireBlockHeight: Integer,9 W( u% \* V0 X
                        additionalBlockHeight: Integer,
& o5 O( e. z- K                        banker: Program,( r3 l% y5 A2 D. L; I; j
                        bankerKey: PublicKey) locks billAmount of billAsset {
# A* R( l" @( k; A) W& Y. H# c    clause collect(amountDeposited: Amount, saver: Program) {: ]! p( M0 x7 v: S; O4 S
        verify below(dueBlockHeight)$ h  |  @: G: O3 H0 A+ t
        verify amountDeposited  0 && sTotalAmountBill > 0
- L8 J# i5 z' T  I( d3 d        if amountDeposited + h1 G$ G0 K. j5 K+ h
// 取现合约(本金加利息)( J, y) d9 n0 F( N+ ~+ J4 T
contract FixedLimitProfit(assetBill: Asset,
0 W/ V4 u# v" M; d1 K8 L0 `3 [                        totalAmountBill: Amount,
) I, a1 `. }: X                        totalAmountCapital: Amount," ~: U0 A5 s7 b5 W
                        expireBlockHeight: Integer,
9 w3 e4 d6 t) h) [& x% B7 V' X1 S                        additionalBlockHeight: Integer,3 s$ |+ `6 V3 Y; G$ {
                        banker: Program,
. H/ b* c2 O! J) |                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
9 G" y9 v3 e  n. f" s4 @    clause profit(amountBill: Amount, saver: Program) {0 I, B. j2 @! k1 Y9 w/ q& q
        verify above(expireBlockHeight)3 ?0 s4 O* B! w) f5 {( h
        define sAmountBill: Integer = amountBill/1000000009 }6 q% E0 @, {0 M  M' X* n7 k: A
        define sTotalAmountBill: Integer = totalAmountBill/100000000- I6 ~: Q1 U6 i) M& K. v) b1 y. q& M
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain 4 d8 Q2 T: X  W$ F! |1 q
合约的源代码说明可以具体参考Equity合约介绍.
- X" p' _- S  y' `注意事项:, z  N6 H) b# Z1 p. W0 h3 |1 U! Q
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    ) ^6 Q9 N* X6 F
    0 {4 _, j5 [7 @) ^) I
    编译并实例化合约
      ^. C$ W6 Y. o编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:; |9 w0 g6 S  \& ?
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee: C9 l5 W# B- E" m7 N7 k
    totalAmountBill         :10000000000
    4 E+ s, L4 j) J+ Q( BtotalAmountCapital      :200000000001 n( a7 F  r; l. B
    dueBlockHeight          :10703 Y% A8 @5 e5 Y/ G" S
    expireBlockHeight       :1090
    $ N5 d# L% b! ladditionalBlockHeight   :1100) D5 z9 e+ T7 p7 [7 ~% F) K
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5% Y7 w; D$ f: q
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf3 v/ F/ {! }; U, n5 R! s2 s; M4 F
    其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
      j; n$ l* N; W7 W实例化合约命令如下:; I* n4 K# F) h! m: M
    // 储蓄合约
    7 ~2 ?6 Y8 ], W2 n" L8 s./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf" x% d0 u0 D8 [
    // 取现合约
    . v) b2 T; d$ U./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    5 Y8 U; }: |& ?发布合约交易
    / |+ T& }4 j2 {, \3 j发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:
    2 \5 S4 j0 u- p8 p{7 n$ }& E  |  o6 F3 O+ {( J
      "base_transaction": null,: s. t# i: O* L, w4 N) p
      "actions": [
    # M, F7 ~, j% V    {, ~8 ^  w) B, W# d( c
          "account_id": "0ILGLSTC00A02",
    $ N7 h) M/ O: Q1 |; |! b9 g( o      "amount": 20000000,
    3 j% S- m! W, G( q% r7 f      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    * @4 e) x6 s, w$ C2 m0 ~8 L4 Y      "type": "spend_account"- L/ o2 O' ]7 s5 U
        },2 n! b9 D* W, M# w9 o
        {+ `: j" E% r! y" i/ ?) m% D% a
          "account_id": "0ILGLSTC00A02",+ i& F- F" m2 ]6 \* }: y- I) B
          "amount": 100000000000,; H7 s/ _7 v1 h1 s5 I. c
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    " }1 L0 t! H2 F0 l      "type": "spend_account"" l* t! }0 E' s7 {; d  p+ h' {
        },
    6 p- F8 h; ]& O. j1 K, Y    {3 }! q$ G5 s7 o, f+ s
          "amount": 100000000000,4 b5 p: ?& w& y) r
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",3 X, J* V' W1 B8 `, \  g# |2 C& g
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",' i3 `: }: q$ F/ u% H2 g
          "type": "control_program"* w( L% g: V. X& ^! C; t" q  h: D+ z
        }
    ( i; L: T, M7 W* |6 {0 P; ?& r# i* o  ],
    9 Z+ L6 A  ^( w2 b  "ttl": 0,
    6 ^" o3 G5 q+ r$ H" d  "time_range": 1521625823
    2 {3 z# g. a  e: F& q}5 Z7 L* f- U9 a
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    0 l+ ^3 ^/ H- f/ C7 q此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:: d+ v* l0 X5 a7 V
    // 储蓄合约
    8 ^( ^9 [9 R9 o, eassetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3( A: f+ R5 h3 T" g
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0
    . y2 M0 m" d9 `5 \- }+ J. f// 取现合约
    / w9 a4 E0 Y0 d3 ~assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee9 L8 j2 ^: r9 t- W/ H
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    - J" \- c% P, ]. h) X# T! b7 p# b本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9