Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
155 0 0
储蓄分红合约简介3 m' s1 Y) Q1 J  M& j; W* {
储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
( T2 u, V' I& m( c+ L3 S/ s& X2 G. f; ]. D% ~
从上图中可以看出,项目方发布了一个利润为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需要再构造一笔交易来提现。% q9 L' L8 ]# a# m# |5 \
合约源代码
) g5 I) N, e" E/ e# _3 A// 储蓄合约
! Z6 `7 S: B9 u5 V0 ^" i* m6 zimport "./FixedLimitProfit"( P' e9 r: }4 h/ Q! r
contract FixedLimitCollect(assetDeposited: Asset,5 e5 Y- C" A% w9 K. U1 q, A
                        totalAmountBill: Amount,
9 n, m; j5 q; R                        totalAmountCapital: Amount,
( l/ z) l1 U8 c) ^2 `$ h9 j; j                        dueBlockHeight: Integer,
$ Z$ v5 n: B. |                        expireBlockHeight: Integer,
5 a% ?) g) Y$ _/ A                        additionalBlockHeight: Integer,$ V+ K+ Z" P4 N* F0 c
                        banker: Program,
' g# w' K% u& z3 j                        bankerKey: PublicKey) locks billAmount of billAsset {
1 x$ a4 c- A2 V6 m) j2 L/ p    clause collect(amountDeposited: Amount, saver: Program) {
( L. P* t) d+ f" X- u3 s7 k$ u        verify below(dueBlockHeight)
/ [; h) D. G- w) l  Z( g% v$ u        verify amountDeposited  0 && sTotalAmountBill > 0
8 j8 f0 o' v; N2 }        if amountDeposited
  d( _; ?' O9 {6 f$ n// 取现合约(本金加利息)
2 h- h4 L0 \: w: c/ w9 u( fcontract FixedLimitProfit(assetBill: Asset,
9 \) C! d+ C# u# W                        totalAmountBill: Amount,
4 ^8 x8 |+ `: N# M0 ^                        totalAmountCapital: Amount,
9 F7 z/ m. ~4 {$ ]; ?. n2 p( J                        expireBlockHeight: Integer,! n, }+ v* ~; X6 H
                        additionalBlockHeight: Integer,
  k4 v9 N7 y9 k0 C. K& e                        banker: Program,
3 ^' H; q1 p$ {5 Y1 q& K                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {7 ]0 k0 V. a- ]) E8 d
    clause profit(amountBill: Amount, saver: Program) {- {, _' {* L+ j7 \8 _
        verify above(expireBlockHeight). i. a# o; ~3 g- b, f" Y
        define sAmountBill: Integer = amountBill/1000000008 C" N, @" o6 e4 r7 ~8 O( t+ ^
        define sTotalAmountBill: Integer = totalAmountBill/100000000
7 t/ _: G( f+ Z5 |( Z        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain
& D* w, D" O# j  K1 n5 o. O合约的源代码说明可以具体参考Equity合约介绍.
) u, Q* {5 @3 h4 n0 ?+ w/ Y8 @注意事项:
+ U* ]+ @7 B4 u' V3 M  Y
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产$ }# x$ L, Q# S, Q# Q/ g

    5 u5 v7 [1 _  P" _# e6 ]; ^编译并实例化合约, n/ V2 b5 p8 A4 X. e
    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:. a  W# T# g# D1 g: }
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    % _7 Y, f3 B" G7 S; a2 qtotalAmountBill         :10000000000
    * g( |5 F& ~; v6 U9 rtotalAmountCapital      :20000000000( n+ J" W2 l7 H, B# f1 d
    dueBlockHeight          :1070# g" }; e9 q0 m4 P! `
    expireBlockHeight       :1090
    ; m) ]$ C; p) R" f9 yadditionalBlockHeight   :1100" Y* {. G1 @" N; A& ~- N
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5" y" w1 i5 [+ u* |4 R- l) r
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    7 c4 h0 A6 a' V0 G其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    6 ~5 r; H2 C/ q实例化合约命令如下:9 |9 L$ N  C* |/ y
    // 储蓄合约6 ]3 g( n& i. ~& R: U6 w2 `
    ./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf* p! w  v( p* H3 V
    // 取现合约* y' N$ @3 K+ C+ k; N6 z' y
    ./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf. a4 K- _' l- z2 E4 @! p7 o8 L8 }
    发布合约交易
    * }5 d5 L- Q4 n$ V' N  E发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:4 b; @+ V/ e" v( K, M/ a
    {
    3 w8 {# j9 B; y0 p5 A, l5 {  "base_transaction": null,
    ' K, J5 g  m  S7 d  "actions": [: K' c/ Y9 B: R2 m/ ~
        {
    ! z; [" A* Y3 ?& V9 [( W0 F      "account_id": "0ILGLSTC00A02",
    : @$ n0 N' N3 j2 p( w* k. c      "amount": 20000000,
    1 T8 o; C& }* q& b( g      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    ; U* L& a: ^+ W      "type": "spend_account": d! i+ C& V  }9 p3 N3 j% W, }
        },, A1 y0 b) Z- H; T" O9 `( _8 R& N% b8 O
        {
    ) e/ Q* i1 m. x2 C6 B% V0 D: _      "account_id": "0ILGLSTC00A02",. x5 p- E; j. K0 Z) V
          "amount": 100000000000,
    ! ^9 o) f. ?+ M! V" P/ t) m$ }# p      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    2 s+ f3 ^9 D& K; M! V      "type": "spend_account"
    + V  S0 ~. a1 u! X1 N    },
    9 T' G9 _8 T# g' c: s    {
    ' f3 v) i; F, o) o      "amount": 100000000000,2 u+ s9 t) L* u9 |
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",# R8 W# R9 _# g/ {$ w& b
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
    ' Q! k: u$ ]& I2 x4 h# x      "type": "control_program"- l+ k% Y8 v% L) t0 H3 C; I8 }
        }6 x5 w  @6 B7 `
      ],
    8 n+ U4 Q( M; t  p9 ^  "ttl": 0,; f; O& q! T, j# n* B0 `) w
      "time_range": 1521625823; q! y4 R' a( d3 G( ^2 M2 }
    }
    0 J1 `* ~. H* p: ~合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。, Z7 p& c! G( u& ]0 j7 z
    此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:2 e$ G! {8 C2 D
    // 储蓄合约
    + F2 H6 X" y% r- ?' F8 r# V! S2 YassetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3- u9 [$ N( K( H6 {" W. ~
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0
    3 s9 n1 \" P) K* \0 p/ z# D// 取现合约
    6 r& |0 g2 |! ]assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    # K! ~$ R: c1 ~0 mprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    " w0 q8 l" D# r本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9