Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom储蓄分红合约解析

人民干脆面
89 0 0
储蓄分红合约简介
4 F% `# K& R* a储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:
; s0 p% y4 N& j# Y
7 R6 c4 \5 e/ }2 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需要再构造一笔交易来提现。
- Q: U# p, h+ g合约源代码. N4 ^5 Z! X2 [" A. e/ u
// 储蓄合约2 v3 A3 Z1 L- r+ p3 J* \: S
import "./FixedLimitProfit"' v) s1 A5 T! \' t3 k" O( C! R+ ]
contract FixedLimitCollect(assetDeposited: Asset,5 P7 t: v' A9 n2 j
                        totalAmountBill: Amount,  n" B( E3 @2 H0 }7 O" r+ k
                        totalAmountCapital: Amount,0 }; [* T# N7 o* Z3 o
                        dueBlockHeight: Integer,
& ~1 X8 \, k- T                        expireBlockHeight: Integer,
: g$ v0 ~# t' i: d2 d" W" ^: P                        additionalBlockHeight: Integer,6 H* p7 A! X% d6 h
                        banker: Program,* l; i  ?8 n" y5 h" O' C! o
                        bankerKey: PublicKey) locks billAmount of billAsset {
9 r7 R+ `% M! h7 ~4 z    clause collect(amountDeposited: Amount, saver: Program) {( r% Q' e5 S2 n' M- L+ q6 x
        verify below(dueBlockHeight)
) b9 n  N8 a- {6 x/ m( G& E        verify amountDeposited  0 && sTotalAmountBill > 0; j+ l) t7 f3 d' m8 ?5 q' W
        if amountDeposited ! _. @0 g6 Z& H3 M2 p
// 取现合约(本金加利息): `( Y+ K+ J. o; s) L5 r0 @0 g8 \: V
contract FixedLimitProfit(assetBill: Asset,
& N( J7 W( g3 [$ k                        totalAmountBill: Amount,, E- B4 ?4 C* }4 u& |  ?  W' c- y
                        totalAmountCapital: Amount,5 t7 y" d. [) `/ e& [$ B+ b
                        expireBlockHeight: Integer,+ ^2 x1 D- }# z
                        additionalBlockHeight: Integer,
( i) p% J4 U6 j" l" F& H' I0 G                        banker: Program,* B+ z7 q- v' K' H* t& q
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {! O( }3 S" u/ k
    clause profit(amountBill: Amount, saver: Program) {+ G6 h, n6 {6 _
        verify above(expireBlockHeight)# O/ F" }0 T/ J$ f8 z( a
        define sAmountBill: Integer = amountBill/100000000# W1 r7 p7 P2 k: q; W$ Z
        define sTotalAmountBill: Integer = totalAmountBill/100000000
! o" ]: M  m/ m# Z2 v" ^        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill  0 && gain 0 U& J2 ]: C% `* A* ~. ~& @2 f
合约的源代码说明可以具体参考Equity合约介绍.  M/ j4 r/ p& d) _0 s+ }7 V  T
注意事项:$ g5 D  E9 o3 x
  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000)
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产
    1 P3 y2 a! r7 D  c. z9 j$ M3 o
    2 n5 n+ M2 M- N, {, l, j
    编译并实例化合约9 W; l; j8 r- Y. W9 g* w" }
    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:1 e# D0 M& U/ V3 |" n  N: Q# F
    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee1 {! _5 l: }( Z% r- O/ o: p
    totalAmountBill         :10000000000/ @% O0 w% j2 W- X+ `$ y2 [/ ^
    totalAmountCapital      :200000000009 l9 t, H  @+ C1 |6 u' B9 o/ G
    dueBlockHeight          :1070. c$ f" Q% Q4 v* W
    expireBlockHeight       :1090) L" C0 \) w. @) r6 t+ h; x% c
    additionalBlockHeight   :11000 U" Q. B$ Q. l+ Y
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5! Q: T, V' L2 e$ h6 `
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    + i* [. N8 X9 D其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpub和Path,否则无法正确调用clause cancel。
    ( B8 r5 `1 V. K8 f/ C& l, t实例化合约命令如下:
    7 T* q1 V, U- ]$ x2 n* g// 储蓄合约
    : g4 W" \  O1 q./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    6 V) P4 X! l+ `  W8 f// 取现合约6 ?' n1 i: Y+ f( I8 p
    ./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    3 ^8 Y+ a7 _' y7 \8 ?3 ?8 l发布合约交易5 `4 m2 c6 U- ]/ V' l
    发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:/ u1 Z+ p0 j  B/ Y
    {/ i4 i4 O/ O) ]! U4 X/ a: O6 y
      "base_transaction": null,7 {/ l! m5 O( H
      "actions": [
    7 s; R: e. `, A$ y    {# E3 h7 G; a$ `
          "account_id": "0ILGLSTC00A02",
    - W2 Q+ m  O( g1 R! H7 Z6 h6 P      "amount": 20000000,
    5 |9 e9 n: I* c( i) u9 Z" R      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    6 B0 [( @' e: L/ i2 n$ w      "type": "spend_account"
    $ J9 H: A' i9 v. b1 c    },
    6 s, G& u; R0 S7 v9 j4 |/ r    {
    7 s% {4 b! ]* P& \0 N( v      "account_id": "0ILGLSTC00A02",$ C0 U6 l9 p6 T# C! _" h% R
          "amount": 100000000000,
    + g( E0 s( [/ V" W1 W5 q' M      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
    3 i/ ?" z3 w* Z& O3 }6 r, m. e: M      "type": "spend_account"* ~, _) ]& A* V
        },
    ( o; z3 T7 G4 |0 {# r    {
    ( `$ G, B* \, L* {7 T  M2 e      "amount": 100000000000,
    # t  w, w3 g) E' n, \      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3"," j7 R. E7 q! Q1 C
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",# |" ?2 N, H, M/ e$ N# p- y& D/ l
          "type": "control_program"; `1 p: q, d& d' L. M
        }
    & W' D1 ^' ~! f  T  ],
    ) W) m# F0 P/ r6 c0 G# p8 e  "ttl": 0,. q2 b  g; m5 ~( s* a/ _: r3 k
      "time_range": 1521625823
    % V  O1 P! L! {( W% p, g}6 x( Z' {0 q( F4 I4 A
    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。
    " F" r5 _1 X; z5 }. H此外,开发者需要存储一下合约UTXO的assetID和program,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:
      m, I7 S& ~% V6 q9 i7 f4 t// 储蓄合约: q% y8 L" _0 R% @; T8 ~# d
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b38 H1 b( W8 e+ ^$ w6 w% \
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0
    5 |4 Z2 [/ b- M+ u// 取现合约( {  m/ z) w" \  O# f9 J- W
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    , |) Q4 k  a# sprogram:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    6 {: z9 T. W  ^5 y* l/ n本期的比原储蓄分红合约就介绍在这里,下一期我们将详细介绍如何基于该合约开发dapp应用
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    人民干脆面 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      9