Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom移动端钱包SDK开发基础

yuan081608
2325 0 0
比原项目仓库:, d4 U6 l+ S2 a7 o4 L
Github地址:https://github.com/Bytom/bytom
1 t$ \) ~$ c7 Q* a, ~/ K  t3 YGitee地址:https://gitee.com/BytomBlockchain/bytom
5 R8 J1 E: ?* Z; YBytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包层代码进行了改造。使用gomobile可以将代码 编译成Android和iOS平台可用的SDK,使用编译后的Android和iOS钱包SDK可以在移动端实现创建bytom密钥、账户、地址和交易签名功能。3 j  x, C& X' ]& j* d' {
Bytom-Mobile-Wallet-SDK源码简介
1 A# _& T# }7 i7 s* d8 S& pSDK源码放在项目的sdk文件夹中,android和ios文件夹是使用SDK的demo项目,bind.go 中首字母大写可以外部调用的函数会作为提供给Android和iOS调用的API。bytom创建的密钥对会存储在磁盘单独的文件中,而且对私钥进行了加密,账户地址数据是存储在go实现的leveldb中,所以Android和iOS平台也需要提供数据存储的路径。
9 l* K5 b9 ?) C$ s( w" Ufunc InitWallet(storagePath string) {
& J3 A" m- a1 P! a    hsm := pseudohsm.New(storagePath)
' X! E" r8 n8 t# ]& S    walletDB := db.NewDB("wallet", "leveldb", storagePath)# C$ i; q+ w" G  w2 j
    accounts := account.NewManager(walletDB)
4 V  h3 _, I5 Z" [    assets := asset.NewRegistry(walletDB)
; g) ^' G' O% ^' ]7 @    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm): N( C$ T4 a% V4 j3 c: E
    api = aApi.API{Wallet: wallet}
  Y  c& {8 Y0 {3 o4 {. ]5 z( e; A}; S: d: K) u# O( a  n  \% ^
Android和iOS平台调用其他钱包API的之前需要先调用InitWallet这个API,参数是磁盘上的绝对路径,InitWallet会对整个钱包进行一个初始化, 其中最重要是初始化leveldb的存储。其他的CreateKey、CreateAccount、CreateAccountReceiver是创建密钥、账户、地址等API,RestoreWallet API能够对钱包所有账户地址资产进行备份导出json格式的数据。
& S4 |  p% z: J8 L1 R" X: HBytom-Mobile-Wallet-SDK的编译7 C5 b" |; n  M3 x" D% T$ @) _
SDK代码的编译首先需要正确的安装golang和gomobile,golang需要1.7以上版本。
; _" H+ |) ^* K, EAndroid平台需要安装JDK、Android SDK、Android NDK,并且需要将Android SDK的platform-tools、ndk-bundle 添加到PATH系统环境变量中。iOS平台编译环境配置相对比较简单只需要安装Xcode就可以了。
$ w9 k; I- Q& P1 U  F" xClone项目到本地$GOPATH/src下:
, {+ @! K9 z/ J2 I* O# l git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile& x- ^. g+ }6 W, T6 y
Android
) X1 X6 m) B: [+ pgomobile init -ndk ~/path/to/your/ndk
- r. j) ^1 T' t+ Rcd $GOPATH/src/github.com/bytom-community/mobile
! Q1 G" ?# r5 z4 Pgomobile bind -target=android github.com/bytom-community/mobile/sdk// Q8 P+ f+ `9 h; x# X
如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-s参数:" I& h( I3 @) @% U( r6 r! V& D
gomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/
8 {9 o7 C& X6 e1 ?* k4 K4 R5 m6 M( E执行指令后会在mobile文件夹生成wallet.aar和wallet-sources.jar文件。! u% X  G2 `# D: h& p3 q9 s9 M
iOS- V$ d$ u( e7 j& H$ g
cd $GOPATH/src/github.com/bytom-community/mobile
2 r* f: o, e5 E/ ]( G1 vgomobile bind -target=ios github.com/bytom-community/mobile/sdk/
$ F# J, c8 o+ Z8 M: t# s3 B# s如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-w参数:3 h- D$ f, f6 G* ^* m# K8 Z: t
$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/2 _1 X( |) D8 t, y' K
执行指令后会在mobile文件夹生成wallet.framework文件。! c3 S# l7 V3 P' A; U1 O' A: s
由于gomobile现在没有支持bitcode,所以生成的iOS SDK也不支持bitcode。0 r% i* k% y( A: }$ q$ q. [; |
Bytom-Mobile-Wallet-SDK的使用
  P3 C/ R' D7 ]0 b# V- JAndroid9 c4 M# \; {3 E+ Q; n5 k( ?; _" e! @
拷贝wallet.aar和wallet-sources.ja到Android项目的app的libs文件夹下,并在app module中的build.gradle文件中添加:' @% J$ h1 {1 P$ e/ ?& j7 G0 g
android {& M! I$ ^1 X0 A: L7 Y. r5 b( c
    repositories {
& j. o& s3 b: a) @* H- C) A        flatDir { dirs 'libs' }
6 x: T5 R7 Q" w# E4 f1 T0 P    }
  c9 p8 d, Q; u% P0 Q$ W}
, Q6 R7 t4 r" S, j. idependencies {
* J0 Z0 V" w, [. P" \+ V& Y  p1 ]! Q    implementation fileTree(include: ['*.jar'], dir: 'libs')/ x* C5 X+ z0 s% B
    implementation(name: 'wallet', ext: 'aar')6 v& W' E! v+ p, T5 ^
}
( Y  P( Z, L! M& }4 H$ Y$ Ysync project后可以在Android项目中对SDK的API进行调用:9 f& L! E7 [. m# w
package io.bytom.community;
, i8 Y, X  ]) O" J+ G$ Zimport android.app.Activity;
; e5 n" e6 |& H1 L7 Rimport android.os.Bundle;6 \9 m  |( R! Y/ y1 o/ F( K3 _
import android.util.Log;
4 M- Q/ u* _* {' V( Aimport android.widget.TextView;
( O5 A- {2 j  ?9 A! @- T# I; kimport wallet.Wallet;, R; m4 c6 E3 o8 i* E6 U% M0 K
public class MainActivity extends Activity {
* _1 R, `1 u& p* F( H    @Override! [( V0 X# M* H# N7 a" D! p7 O9 u
    protected void onCreate(Bundle savedInstanceState) {, `2 u; w8 \+ d$ H
        super.onCreate(savedInstanceState);2 g9 M: L' A; P0 W, l7 f( m: F
        setContentView(R.layout.activity_main);' q* B' {' I4 q2 s! C$ v1 K3 i
        TextView keyTextView = (TextView) findViewById(R.id.key_textview);) f# w, n9 d. u$ g
        String storagePath = getFilesDir().toString();1 S  P7 D8 y$ q; p: _2 t
        Log.d("storagePath", storagePath);6 }, V2 ]+ U' i7 U0 j
        Wallet.initWallet(storagePath);
7 z4 _- ~. M2 ]        String keyResult = Wallet.createKey("Marshall", "123456");: t" V& X; {1 ?4 `; {
        Log.d("keyResult", keyResult);
1 }- a6 X. b+ Q9 t  C% Q0 }$ ^9 G        keyTextView.setText(keyResult);
4 F- |0 P5 c2 q, W/ T    }
+ L# R1 J/ [& g& o, H/ f9 J% j}
, [& c" x! q/ P5 O6 ^# G) oiOS
8 N: V) [& S% R6 x通过项目target的Linked frameworks and libraries把wallet.framework添加到项目,可以在iOS项目中对SDK的API进行调用:8 _4 t' r/ c  H$ Q- ?: |. p# k
#import "ViewController.h"
, X- p: @, D8 P3 r4 ^$ I  m9 j#import "Wallet/Wallet.h"  // Gomobile bind generated framework
: x5 s% h' `7 ?: t@interface ViewController ()
+ `! \# [+ U4 J@end0 r: L5 v/ F5 w2 a, |- h
@implementation ViewController, h% I3 y( s* i! p0 T; {3 T2 N
@synthesize textLabel;
, k0 s/ R% R& C7 C- (void)loadView {* C( o8 M1 x; R' |
    [super loadView];
! e8 K& H/ R# o& U: {* v    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
7 m, @8 u  u. ^! c4 f: f, {    WalletInitWallet(docPath);0 O0 L3 d; \, y; Q3 a1 O5 r1 v
    textLabel.text = WalletCreateKey(@"kevin",@"123456");' H+ v2 a$ N5 S* ^% v
}7 `. v$ H5 \1 I, A- d5 x1 Q, S
@end
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2