Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

使用智能合约实现自动分账

哈哈笑417
119 0 0
自动分账是很多平台都会用到的支付功能。很多互联网内容售卖平台都会跟内容提供者分账。比如:Apple 的 App Store 跟 App 开发者三七分成。很多平台都使用了支付宝、微信支付作为支付手段,但是要同时实现给内容提供者分账,却是一件不太容易的事。使用 FIBOS 智能合约可以很容易实现这个需求。
. g- g* m! |# l
8 |; b  j- ~$ T6 n文中代码已在 GitHub 上开源。https://github.com/fengluo/fibos-subaccount
/ g0 r* x' E0 S  k' |/ u6 n+ y# A5 u& {3 [! g
设计思路% K$ l8 U+ q; f& l. Y  j

) v1 I7 I# l6 c, Z( ]在 FIBOS 转账是通过 token 合约的extransfer方法来实现的。extransfer方法在执行的时候会给转账方账户和入账方账户发送通知。所以用户给平台方账户转账的时候,平台账户就会收到通知。所以整体业务逻辑如下:
, c# ^1 `; k# j6 E) h
* _8 f! K2 h3 `! d        quantity: 10 FO
: r2 y3 o& `$ N; Q
7 h+ }5 ^0 w/ q* A) N; R& Q6 D        memo: 内容提供者账户           quantity: 8 FO
: f$ e% h4 N# {9 l) |5 n, L/ n0 M3 z$ T
用户账户 -------------------> 平台账户 ----------------> 内容提供者账户
% y& N; l/ o3 d4 }# X4 ^& m( v4 R& m; ?+ x/ `0 D6 H1 a
            extransfer      2/8 分成   extransfer; H4 x( F0 B9 F

" Q: }7 f' J- F* G: G: m5 ~1.用户给平台方账户转账,memo 中填写内容提供者的账户名。
  ~# L; X, C  K% ~" }, V5 G. a- H: O4 X* O+ u* g% w
2.平台方的账户合约监听 extransfer 方法的通知,然后做出分账计算,给对应内容提供者的账户转账对应金额。2 c7 C  T0 i  t, h. T
1 S) m, K  e) E/ @, I% o, |
整体逻辑很简单,整个合约代码逻辑差不多用20行就可以写完。
, u) l; Q$ g% J& o, x0 T0 W0 Q; \8 ]5 L3 o( {( d6 {( u
编写合约
" k( y8 V, o2 w* \! j
: X; k" }! H' l( Z1 D3 Q/ sFIBOS 的智能合约分为 ABI 文件和 JS 合约两部分。ABI 相当于合约接口,JS 合约则是功能实现。本案例目前没有接口设计需求,不过 ABI 文件还是合约不可缺少的部分。所以我们简单创建一下就好。# H) z1 y8 {3 ^

& W( ~8 Q5 R/ [5 R+ Q' {我们先创建一个 contracts 文件夹,合约文件都会放在这里。然后在此文件夹下,创建 subaccount.abi 文件,内容为:) t9 k. |% [' Q! n4 X
3 H; S$ X% w  f7 D0 K
{
' f7 T1 y$ c1 w6 K' |) ?
7 `2 b2 v$ H- L1 \+ r6 e2 M    "version": "eosio::abi/1.0"
, l# \+ h, N; Q$ X# f; f" \! N# p" J" _
}
, u  Z4 e1 g' Z- P8 V- g' i9 U" @/ H, [% z- m
JS 合约部分也没有太复杂。在 contracts 文件夹下创建 subaccount.js 文件,代码为:$ y8 n8 v/ D# L3 j
, ^8 D1 `5 y' {6 B( x; D/ Z1 I
exports.on_extransfer = (from, to, quantity, memo) => {0 ?- @* Q+ e$ F8 ]! I! l2 F( `" A

8 E4 Q7 t5 q( M6 r0 t  c5 x$ ?    // 需要在开头做一些判断: Z* i& l) I, B. G$ e4 p
) P9 U+ o' ~5 G2 N/ O+ l
    if (to === action.receiver && action.is_account(memo)) {# {" O$ G2 n" ]

8 h+ g! |8 H( F; Y4 i        const num = parseInt(quantity.quantity.split(' ')[0])
# |. \  Q$ G2 W4 b. a3 I+ m, |. ?- L  |
        // 假设我们约定平台方跟内容提供者是2/8分成。
2 H; i; [; L  `( z+ `" {0 m7 T
# \2 Y) V; Q  t        const subnum = (num * 0.8).toFixed(4);
0 F( F2 ]/ @) \4 N" a. P( J
- X5 i7 K1 p  ]( a% A        trans.send_inline('eosio.token', 'extransfer', {  K& s+ P  P# m# v
/ R3 U& T9 B! G3 s9 n
            from: to,
- h2 D9 e. W. y4 {5 g1 ]9 l1 Q4 s* ~6 B
            to: memo,
& b. d8 a2 G" p) D) {3 h4 y" \2 S
# F: w  x/ W" @  b2 l1 `            quantity: {
6 @' \  C. A: r, P/ Q$ ~% c+ i5 U5 ~0 k1 O& Q% H/ K
                quantity: `${subnum} ${quantity.quantity.split(' ')[1]}`,
4 e+ S8 c2 S2 J6 V* c& ~; k  m  ]2 g! n* S3 I  h$ A/ p+ ~
                contract: quantity.contract0 `( Z8 [7 \+ m
9 K7 y' e" V; O5 ?
            },
3 G( Y6 B) U0 B4 B
1 j( t6 M4 z2 I            memo: 'sub account'6 {9 ~& k4 }3 d

' R$ W2 N4 o! L' [* X        },
# [0 j; [4 S( E! R) _' ~4 [8 F  J1 z) W" l
        [
6 d2 U$ W% C9 A- ~5 o! L
9 h! w" x$ ^+ u            {
$ h' t: ]7 O2 ]3 I8 [% m- \
4 N* D1 Y3 s+ w0 `5 m7 v% ?) T( x                // 需要提供合约账户的 active 权限
. G4 {3 T) m3 m: ]' v0 B
7 {# O9 u+ t3 ^7 h2 k. `3 @0 w                actor: action.receiver,
8 T- \. ], f; w: @" D5 l" y1 n. n9 G* G6 _$ C; ^. U9 ?
                permission: 'active'
0 K1 V: ~/ j* \$ u  t- `- Z6 u8 @
, H. T7 I& [) v, s% y% P( O            }; e+ `# }5 W' p3 q3 P1 P
+ h: F( R! @2 R% @. d" l' s% i! t
        ]);
1 K& G3 u1 R, @% X7 o3 y& E) Q$ r# ^/ o
    }
2 |% P' q: Q# K8 @+ W& c7 T! S$ F- \% {) ~
}. n9 P7 I9 F, x

+ S3 b- ~8 `# z: L合约代码开头我们需要做一些验证。
. R3 H) M$ a" Z( y5 t
/ |; l8 u7 A& n4 A+ G* {1.收款方的账户为合约账户,否则因为下面代码执行给内容提供者转账时,因为转帐方也是合约账号会再次收到通知,造成无限递归,超出最大 send_inline 层数而报错。6 [# W5 }' o) b

8 m' c6 ~* V* x5 Y1 G/ }2.我们用 memo 参数来放内容提供者的账户,所以我们需要对此参数校验一下该账户是否存在防止打错。
8 W- J9 q; M! ^  Z+ l
8 D* {7 e0 X9 q5 O" }1 A1 p0 x合约代码中我们使用 send_inline 调用 eosio.token 合约来执行转帐操作。转帐操作需要对应账户的 active 权限才能执行。为了解决权限滥用问题,FIBOS 定义了一个特殊权限 eosio.code。我们需要在平台合约账户中配置权限,在 active 权限下添加该合约账户的 eosio.code 授权。具体的配置操作会在下面说明。
  {, M+ K- o- s  ^8 Y5 H* Q  J3 p3 a/ G. M3 T
在 FIBOS TestNet 上注册账号
% k, }  C2 k9 _& H4 f6 F8 o3 s
2 X' X* _# Y9 j% B为方便测试,我们在测试网 http://testnet.fibos.fo 上注册三个账户。8 Q) \8 h2 r. z& K0 e1 c/ L1 a

2 a* o; R) i; g2 u& i. z用户账号 helloworld11- e# k( L; S( H0 T0 ~
& Z  K8 [3 V7 B' i( i6 K
内容提供者账号 helloworld22
- a' W' x2 }/ |+ G/ N% I4 t( `0 j. r8 |2 {3 Z
平台合约账号 helloworld33
0 i4 i8 ^0 M2 f* Z# ?5 |$ K0 Z
7 M9 S8 b8 s3 y- U0 G我们需要记录这三个账号的账户名以及公私钥。以便下面的开发使用。创建一个统一的配置文件来记录这些数据:
$ e, h! |  B, \- i9 |- t  M: t  q0 U: ]
const config = {
. \* X: @1 Q% |9 S2 x+ d, E- h5 H# S6 s
    // 平台合约账户的客户端配置8 v5 H: k& _7 [5 f; F
6 y4 x/ l/ f* o3 J! }  X
    client: {
* {& ^6 Z- \3 l! O4 C
( R3 M4 z5 @# s; F        chainId: '68cee14f598d88d340b50940b6ddfba28c444b46cd5f33201ace82c78896793a',: \3 f! _+ s5 W. c/ @: n- M4 ^* ?
' t8 ^( H1 n6 z
        httpEndpoint: 'http://testnet.fibos.fo',0 L, x- L! C+ L7 M6 V7 Z
- q) e0 |& H9 R2 m& w1 z( r
        keyProvider: 'PRIVATE_KEY_OF_helloworld33'
* T+ T9 F3 k- V: R. l+ t
# E3 f* J* F; F. O1 Z: |3 u3 T    },) [* h9 m  [* E' B
" y1 H+ H9 W4 m& q2 O' Q0 j6 U0 y
    // 用户账户的客户端配置
& Z% v1 ]0 u( [1 F$ B
% Y0 y6 p9 L' s4 M$ o    callClient:{# D4 W( Q+ ?) Q9 {

3 C. I8 r( A) p* }3 m        chainId: '68cee14f598d88d340b50940b6ddfba28c444b46cd5f33201ace82c78896793a',
* r, Z0 d4 S4 C7 q5 l6 E" U  E
        httpEndpoint: 'http://testnet.fibos.fo'," R, R5 p5 x+ g0 T

7 W# m8 K: \' q        keyProvider: 'PRIVATE_KEY_OF_helloworld11'
: X& m% F: {% s: A3 f. i$ H, p* y( x* e' h0 \) x' E; N" Y
    },
. W4 H: m% ?, I, A4 d$ T0 @$ J9 G; c7 T' h; D- Q' n
    // 平台合约账户信息
1 b1 F% a+ J  U! l# X9 {) y- }& e! I5 Q- ~/ I
    contractAccount: {+ \9 `5 o  c$ r, h

" L4 ~% ]6 _+ s. S        name: 'helloworld33',7 }+ _1 `; S5 e9 B' l; V# z% m

! ?. _  q3 X6 J        publicKey: 'PUBLIC_KEY_OF_helloworld33',
$ @, C; o6 R" D# ^+ I3 u) u* R
+ Y5 J% V, ~' N, J1 w' _7 w1 f) S0 t  Z8 ?        privateKey: 'PRIVATE_KEY_OF_helloworld33'; f6 |7 j+ K7 j  [# B1 X5 m

2 b: U3 @+ e0 m    },
5 Y. l. w5 j& x$ E1 d1 ~
9 L$ v2 m3 N' s$ X8 m( d5 H" X6 y    // 用户账户信息% l( |% q/ R, \3 Z  p6 i
2 L) C! \9 F' b* {
    account1: {; x6 F; Z9 Z' O! W8 U! m, e% n
6 ~  y4 b' Q" p: ~
        name: 'helloworld11',
5 O( x( J/ K9 t& i# v0 q
3 n: K0 m8 m/ }/ X: \# }6 f        publicKey: 'PUBLIC_KEY_OF_helloworld11',
$ p  x, I! G1 L6 |  p3 D/ L' M. A/ y6 I$ l4 u
        privateKey: 'PRIVATE_KEY_OF_helloworld11'
7 o1 U  K! y7 {' i7 U. o; x1 z( u$ j7 O/ m
    },+ ]" g3 C3 Q1 z/ m7 D) I
8 I; O$ z4 b3 f" T) j% m, C* J: C
    // 内容提供者账户信息
* Q/ ~5 Z9 g- u! p0 T0 O
4 H' U2 W  O4 u% P9 c# ~5 U    account2: {
$ B( W) H- s, Y: n1 s! U% f- I! Z
" V$ g4 b! @" ]+ G6 R& O        name: 'helloworld22',0 n5 a9 A: \8 X
# Q8 D; i, p0 t# d- h* h
        publicKey: 'PUBLIC_KEY_OF_helloworld22',# U% s6 M- A$ I# a% O

$ e1 F8 u# O: P, g; l% k: z        privateKey: 'PRIVATE_KEY_OF_helloworld22'7 b3 W" @0 T! d7 m! o- z. C' }

4 }5 x* f$ D+ `! o( q/ \    }
/ r5 E6 ]5 B- B- C1 F! Y8 ~, v, x3 K" s0 |0 L
}$ d: V- _- f8 _3 \" C2 j# N2 i
4 {! I) Z3 T+ Y/ r0 ^! Z$ j- y
module.exports = config
' C, g6 r' k7 \0 @/ \. U% I. m2 c4 \$ ~. e
配置权限
, ?6 Z0 B! m: y0 I
& ]' M% W1 J. ]0 [4 Y! E在合约代码中,我们调用了 trans.send_inline 函数调用合约 eosio.token 来实现转帐操作,但是转帐操作是需要账户的 active 权限。所以我们需要更新一下合约账户的权限,需要添加调用者的 eosio.code 授权到它的 active 权限。这个调用者自然也是这个合约账户。/ f; [7 F1 {9 G. @

; O( x6 {5 a' M! h6 [const FIBOS = require('fibos.js');  @1 n, r6 b) M: a& ?; O* b; i
/ {% ~8 q8 m: m; G9 G
const config = require('./config');
4 O  J8 F, _- `0 [4 _
( z+ ^, X. z. j4 Jconst fibosClient = FIBOS(config.client);
- L7 d* @$ d5 |5 F
; ]' x& B) ?% ], ~let ctx = fibosClient.contractSync('eosio');
0 }! K, n  c' M
/ Q; x& s5 Z/ N# X9 `3 Ivar r = ctx.updateauthSync({, m% T; o. ?# l5 N! ?& j7 G

& ?: _$ ]0 @7 K: J: c! T  account: config.contractAccount.name,
, o5 I( A5 a& h# m; C% x4 f  ]) z0 h2 L- [6 k5 Q7 R% E, b" g8 r
  permission: 'active',
, ~- f: S- a' x0 X
! D% f( M* c, r1 z9 E. t  parent: 'owner',
" r, i8 v( D7 k0 f6 u( b  w# `, J+ ^2 \7 l
  auth: {
# f7 Y( y& O$ g8 K% ?1 i) Z2 g: g; L7 Y4 \
    threshold: 1,# P9 k2 H- D2 S, d5 e

/ J; y  d& _: h6 n* j! b    keys: [{1 {. H/ z0 E8 T" _& E
' r/ V7 t( x6 h- d3 g3 l
      key: config.contractAccount.publicKey,) Z3 O" X6 O: o( p( ?; x8 y' A2 P* @

5 d" [$ J7 {6 k5 r      weight: 1
7 I9 ^7 I  ~. r% K2 I) f; O+ \7 s" D0 }$ m
    }],6 [; g- A- j. K( h& l

- e* \( E0 t, H    accounts: [{( ~0 E/ B8 D4 P
* y' E2 X* l$ i$ @! A
        permission: {2 b/ u2 ~9 [" }9 b! z* O3 x

. J7 K* i: b0 @$ {1 m! s$ {7 |            // 将调用者账号的 eosio.code 授权添加到它的 active 权限下。( L" l: n4 H6 ~/ B
& k& B; [- A- U" G/ c5 Q9 @* V
            actor: config.contractAccount.name,2 e& v6 V, J, H9 J, v
* M; z0 l  H, T9 f
            permission: 'eosio.code'
  g& |! v" K7 z+ g: B3 K, K( u, J1 v& A7 z. {
        },
2 D% O' w. o; _+ H. ?* t) E  n0 P" _/ B
        weight: 1
# s, a' `. q% O  d8 e1 H6 W- d  p6 e( O) @+ i* Z% P
    }]- u- p& D9 w% Q
/ J" G) V- ?. F9 }
  }
% `6 E/ K# F. l. [8 h) v7 i% ]. d: t6 l1 S& G0 j% Z
},{
3 v9 a* _( Z3 k# P2 B
' B4 J" T9 Y+ q2 J+ w0 Z8 v$ H# R    authorization: `${config.contractAccount.name}@owner` //更改账户权限需要使用 owner 权限* s) ]' {: k' u0 x

% v+ I8 E- F6 p, @});
: U$ U. b' Z# q
' U' w  ]5 o+ ~. wconsole.log(r);. I+ Z$ r; x( M9 z, V3 |" f

1 q. E7 C) Z: _4 ~9 V部署合约
  M" H2 h9 I7 ~8 G. ~* X  G$ I2 r7 _1 R' @1 w2 M& }) o* B9 O# V
const FIBOS = require('fibos.js');- a' P  g1 y5 l$ m- ?* ]

$ C6 y& i: P# M& @" s7 N. T- jconst config = require('./config');8 a6 W# K- J( j& G0 T6 D

: E( D5 s9 V- i) E7 |/ \* Dconst fibosClient = FIBOS(config.client);
( u8 O+ h$ G/ ]& F
7 S6 _* Z1 P1 hconst fs = require('fs');
, O+ d0 V+ P0 t: O  s7 v3 I; v. Q3 B6 ]6 p' q) ^
// setcode( D$ s" j& g- Z5 h5 Y: E9 h& b
8 n+ W  O% m$ k* L8 r' J& [1 Q
const jsCode = fs.readTextFile(`${__dirname}/contracts/subaccount.js`);* I6 L/ |2 d, S' A

3 q  e4 v' x( x# |" ZfibosClient.setcodeSync(config.contractAccount.name, 0, 0, fibosClient.compileCode(jsCode));
% @8 R) i% `9 o, V  X- M" C2 L3 f- G
' \# N) }; [9 j0 L& z7 P" w// getcode
9 G8 \1 z. k: [; V7 b/ w9 e
; d: S8 R! I+ {% R) yconst code = fibosClient.getCodeSync(config.contractAccount.name, true);$ |  W! Y0 k& x% _9 c9 u9 H( R3 P' Q

5 a0 T* w2 G6 yconsole.log('code:', code);
! s+ K9 e# c/ Q, W6 O- z/ f& r- i5 R+ w; b$ |0 k4 [
// setabi7 R. W1 k; s' R( T: D7 @: _
6 e" z# G' R3 q, b
const abi = JSON.parse(fs.readTextFile(`${__dirname}/contracts/subaccount.abi`));
, g# ?& j7 W3 i5 f& T9 K
; T& O/ v) E2 `1 ]+ n4 S2 b! KfibosClient.setabiSync(config.contractAccount.name, abi);2 q4 Q% J8 ~0 V- e

4 ]9 e( b: C  x3 [4 ^9 N转账测试
* W$ e) @. u3 E6 D2 D6 D. R( |% Z
  e" ?. J) n: E$ I$ U我们先来写一个脚本 account.js 来查看三个账户的余额。
/ v. v6 U2 L* s7 L" \6 x7 A" c  c4 A# z" {
const FIBOS = require('fibos.js');
# ]! p! F7 v/ `* Q0 ?) o) D( w& S( e9 f. h- \, U
const config = require('./config');
$ o/ O) p1 }* {/ g* X3 ^
: g  n  ~& K* e7 y0 m. tconst fibosClient = FIBOS(config.callClient);
1 |# M8 N* m  Y" Q& k' E
" F: p8 q) n3 R  Y1 N* K9 l, uconst account1 = fibosClient.getTableRowsSync(true, 'eosio.token', config.account1.name, 'accounts');. W2 `; B2 @& O& k' V
1 k1 S2 f9 p/ ~( e0 l
console.log(config.account1.name);' G- m6 q7 i' X9 o

( k$ a2 J8 U- z! r) B$ p- i6 qconsole.log(account1);
# x' k0 K+ o" A: ?( R9 ^5 C% c9 R2 E9 J( Z
const account2 = fibosClient.getTableRowsSync(true, 'eosio.token', config.account2.name, 'accounts');2 y9 _' \! h2 Z8 X3 U8 U
" l7 y3 D6 \! K* a% I" O
console.log(config.account2.name);
! b! A* E+ A" l* A3 G6 q+ m8 t% o0 d9 ^
console.log(account2);
' I1 _. v3 C6 C0 j/ d2 H
! e. C% P7 ]) T/ [& Dconst contractAccount = fibosClient.getTableRowsSync(true, 'eosio.token', config.contractAccount.name, 'accounts');4 O$ F% ?" a1 M4 h' T3 b4 s

" Q2 ?2 N2 p0 V% G* ]4 Mconsole.log(config.contractAccount.name);. T  P( j3 O+ o8 |& }( X$ L' ~

/ S  |3 s' f5 M$ fconsole.log(contractAccount);
; d) a4 R9 R" _9 G' g* T  f5 z: K  q( d7 k; w
执行 fibos account.js 来查看三个账户信息。 目前我们的账户还没有 FO,所以大致情况是这样的:
) C( t& S2 u2 X8 G
/ q( t! d( U4 A; z' _: ?+ A- j用户账户:helloworld11 金额:0.0000 FO内容提供者账户:helloworld22 金额:0.0000 FO平台合约账户:helloworld33 金额:0.0000 FO
( s+ M6 g" g  v7 \5 q
( F7 u4 W% o/ W+ r" r# k

* t+ O6 [# a) A! u; p5 C% ?
6 N5 i! V1 W* f+ w) H/ D; ^测试网会自动给每个账户发放10 EOS 的通证用以测试使用。账户中还并没有 FO 通证。所以我们再来写一个兑换脚本,用1 EOS 换一点 FO 通证。
5 E% I% x3 [7 `% B! i" ]* |. x* R6 V% _( K* Y% E
const FIBOS = require('fibos.js');
" l% o7 y1 y  w5 n3 r/ Y
' O7 \# E6 I/ \% qconst config = require('./config');( k: F  d# S  e: Q

. {# d$ `/ n* [const fibosClient = FIBOS(config.callClient);
0 g, M. z* [6 Z+ K0 L8 \# o6 P9 Y% K1 {; w0 b7 I
let ctx = fibosClient.contractSync('eosio.token');
  I. f# @1 B9 `, E  s
; w% D9 r4 A, [" X+ m" d+ m( A# @const r = ctx.exchangeSync(
  {1 M- x3 `/ _' ?" Q
, w; k2 Y( g" u9 H0 f7 [3 s    config.account1.name,
- J5 A' ^7 F, I( ?  R7 B; G- L& i" f4 |  j. J& L. z
    '1.0000 EOS@eosio',9 U4 ^" Y6 a  v" ]5 d
- s3 i* i# S8 v
    '0.0000 FO@eosio',
  T3 I( }$ Y/ h# f3 s. U6 z2 {1 \6 u) s7 Z: h0 G6 H9 }( K
    'exchange FO to EOS',4 L8 R/ C- B+ O1 r; e

  W$ ?  j/ p" P' {/ U+ y7 i0 l4 W    {
, V) n) ?4 V% U2 K4 f. u
" I, V( }9 S: ]/ q        authorization: config.account1.name
5 G# T. _8 u8 Z) D; c
* Q& `1 R9 M6 l" m$ }# R    }) _" Y9 [& v% v. j# B% w) a
# ]6 m" T- k3 s" }& Z. a/ j3 a
);# u4 m" U6 r( n# j' Q, H% M6 w
: _! T4 P  }8 c4 ]5 |' x- v7 A
console.log(r)1 q7 {: Y4 y* D+ R

) I/ b5 g% S1 |* W" E9 w再次执行 fibos account.js 来查看账户信息。目前我们的账户金额大致是这样的:
1 E8 Q# Q' p# [5 P
$ b9 H& T/ i0 p" r6 m9 Q用户账户:helloworld11 金额:146.4245 FO内容提供者账户:helloworld22 金额:0.0000 FO平台合约账户:helloworld33 金额:0.0000 FO5 o5 m: P8 P5 _5 X

" g8 s' {6 `  q* o下面写个脚本 transfer.js 来执行转帐操作。
: _' D7 x- N# M& p+ {1 v# t; ^# Z2 E1 s, z; m/ X
const FIBOS = require('fibos.js');
0 d( r9 \; E* H1 Q$ ~9 j
+ }* o- p$ f; y& G/ P) p" d' hconst config = require('./config');1 W# ~) E, W3 a8 b6 S* l

5 N+ C% ?! O' Lconst fibosClient = FIBOS(config.callClient);) ~! Z; ^/ ~6 U# U# C

  P( a. y: M  S. O5 _let ctx = fibosClient.contractSync('eosio.token');9 u3 O0 t0 W$ C  R5 W  u

/ K4 o! |5 v8 K& W% }const r = ctx.extransferSync(
, r+ @- `2 F& ^0 T' B7 N8 c
. R# C7 r6 U: Y, Y3 q$ C" W" H0 x6 x; k    config.account1.name, // 用户账户
- I- \! i! ?7 R& n) J$ t! L7 c! B: f, o! N. F2 Y' ]
    config.contractAccount.name, // 平台合约账户  E3 Z% o* }4 q( N, p
4 ]3 V' U7 `7 K
    '10.0000 FO@eosio', // 转帐金额& B" r% ]. h2 ]3 K; w
3 X1 S, u( N. t$ w- z* W
    config.account2.name, // 附言填写内容提供者的账户名,平台合约会给它分账5 j6 q" Y+ i9 o9 b
1 J% a) ^, _# @* B2 Z6 A2 W0 u
    {9 D& K' U/ Y# I4 K6 z

$ M5 E3 B# H- [* E+ r        authorization: config.account1.name //提供用户账户的授权
' V# t( J7 a- ^, x  }1 B
- [8 m; m* X$ H9 m; f7 P6 N    }
; q/ U! B6 b/ o' U) W/ I7 H7 U* j
+ R5 Y4 p2 \; F# F4 O% U)6 ^+ k' r2 O- m( B& w( y

1 ]* c) w' o, u# ]$ O8 u3 R7 Q$ mconsole.log(r)
, {& |1 t  X$ K" O1 y& E+ y$ P1 O. l4 U. H# m" E8 `7 M
我们要从用户账户 account1 给平台合约账户 account3 转帐 10 FO。memo 参数为要分成的内容提供者账户 account2。根据合约中定的2/8分成,平台合约账户 account3 将会分得2 FO,而内容提供者账户 account2 将会获得8 FO。
1 Y  ?1 @9 m* Z. g- I5 r- b( Y: i
使用命令 fibos transfer.js 执行该脚本完成转帐操作。' J4 S) c5 `6 j9 M/ }- u3 f

9 A1 ]' u' F4 e5 _# B下面我们再来看一下目前三个账户情况。执行命令 fibos account.js。三个账户金额大致如下。$ C4 F& ^1 T& U& c# m  w3 R% f$ c

6 x% e# r1 R% ?7 k* W  S用户账户:helloworld11 金额:136.4245 FO内容提供者账户:helloworld22 金额:8.0000 FO平台合约账户:helloworld33 金额:2.0000 FO
1 ]) D3 H3 ^( n/ @* ]0 B* z2 p' r4 u( m
结果显示,分账账户和平台合约账户如预期那样获得8 FO 和2 FO。
, l' k4 `" E! r* n5 |$ K  b  a" l- P4 y+ B! N6 ^! l$ ~+ U8 u9 D0 d

  [4 p( R" q. c; E; y2 R' J! n7 S+ K. K
综上,我们成功使用了智能合约实现了自动分账。平台方还可以继续根据自己业务需要定制自己的合约。$ p, Y1 Q  O1 E7 g6 u
0 u" ^- [/ u+ `7 C4 v6 J1 R5 W8 U
文中的代码请参考:https://github.com/fengluo/fibos-subaccount
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

哈哈笑417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11