Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom移动端钱包SDK开发基础

yuan081608
2335 0 0
比原项目仓库:
. T9 a8 Y4 N7 m6 XGithub地址:https://github.com/Bytom/bytom
0 g, W& ?# o3 p; PGitee地址:https://gitee.com/BytomBlockchain/bytom& |1 W' x; \4 M- m2 F' n
Bytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包层代码进行了改造。使用gomobile可以将代码 编译成Android和iOS平台可用的SDK,使用编译后的Android和iOS钱包SDK可以在移动端实现创建bytom密钥、账户、地址和交易签名功能。- B: c3 u* j- E* G
Bytom-Mobile-Wallet-SDK源码简介" n: f) k, p5 H0 }: y7 p
SDK源码放在项目的sdk文件夹中,android和ios文件夹是使用SDK的demo项目,bind.go 中首字母大写可以外部调用的函数会作为提供给Android和iOS调用的API。bytom创建的密钥对会存储在磁盘单独的文件中,而且对私钥进行了加密,账户地址数据是存储在go实现的leveldb中,所以Android和iOS平台也需要提供数据存储的路径。  T$ A! `2 e' Q- [; b
func InitWallet(storagePath string) {
3 G% R* D, a) f. o8 M% ~( T    hsm := pseudohsm.New(storagePath)
- L& O, a. s4 n$ l! Y+ Z+ ^: s: r9 O, Q    walletDB := db.NewDB("wallet", "leveldb", storagePath)
  f7 t, A. ?4 z: p. ?    accounts := account.NewManager(walletDB)
6 Q9 s1 o* _, T: b1 Y5 d' j: l    assets := asset.NewRegistry(walletDB)
" f: f* W$ g( C5 W$ n  j    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm)) g5 V& Z0 X( e- Y6 H' _. b; q
    api = aApi.API{Wallet: wallet}, e0 o0 k" }+ ]" m0 Y' t' d
}3 m: Z; N4 Q3 ~! A9 _
Android和iOS平台调用其他钱包API的之前需要先调用InitWallet这个API,参数是磁盘上的绝对路径,InitWallet会对整个钱包进行一个初始化, 其中最重要是初始化leveldb的存储。其他的CreateKey、CreateAccount、CreateAccountReceiver是创建密钥、账户、地址等API,RestoreWallet API能够对钱包所有账户地址资产进行备份导出json格式的数据。
8 ~" D$ T; f( T: h; W6 VBytom-Mobile-Wallet-SDK的编译
% \6 `0 b/ @- X8 x9 Q- J9 ySDK代码的编译首先需要正确的安装golang和gomobile,golang需要1.7以上版本。
& I& [3 Z' w$ ^. |* IAndroid平台需要安装JDK、Android SDK、Android NDK,并且需要将Android SDK的platform-tools、ndk-bundle 添加到PATH系统环境变量中。iOS平台编译环境配置相对比较简单只需要安装Xcode就可以了。" b1 Z6 j8 A' z
Clone项目到本地$GOPATH/src下:4 v+ f) u3 J$ F- R, ~
git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile" L3 R1 r( ~3 P7 k
Android
$ w; \/ r3 s# V8 _3 p3 v7 |9 xgomobile init -ndk ~/path/to/your/ndk5 c) k( ?' O% T3 B! b( L
cd $GOPATH/src/github.com/bytom-community/mobile. S. G3 p3 ?4 A2 z5 A, r
gomobile bind -target=android github.com/bytom-community/mobile/sdk/9 Z- h# l1 B8 S. g! P# c8 \, S
如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-s参数:
' b5 ?* t- \/ G5 rgomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/3 R: c8 U) D* r* l1 U8 A
执行指令后会在mobile文件夹生成wallet.aar和wallet-sources.jar文件。
: P1 W; W5 f. t, Q$ O% ViOS
, `$ x9 m) S- R: R3 \. Lcd $GOPATH/src/github.com/bytom-community/mobile
. {2 ]9 K4 v* n6 U6 i" o& Cgomobile bind -target=ios github.com/bytom-community/mobile/sdk/
( J# S  ?# F, i1 M7 Y& j- O* j如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-w参数:; z# x4 ^% C% q) s- f. t3 O
$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/
. J, _: M0 j3 [/ U$ W- x0 p执行指令后会在mobile文件夹生成wallet.framework文件。
; W( W$ d2 K+ W5 X由于gomobile现在没有支持bitcode,所以生成的iOS SDK也不支持bitcode。
: L' K% s/ O) G7 qBytom-Mobile-Wallet-SDK的使用
, N7 ]& ~8 `; g; H& mAndroid  D9 @7 U1 N) t5 }7 I
拷贝wallet.aar和wallet-sources.ja到Android项目的app的libs文件夹下,并在app module中的build.gradle文件中添加:8 C6 J; p! M' W- _4 R% A
android {
/ a' S* T. M, |" D    repositories {
# Q8 b7 `/ j4 h$ _8 H3 c1 L        flatDir { dirs 'libs' }/ i  O2 n$ q6 ^  D" c9 Y" T! B/ d
    }# L3 r) D0 F$ j8 q: q
}
9 q7 S7 V8 v/ A9 ?5 S* ]# tdependencies {
/ }2 p6 B$ U0 B( A7 E    implementation fileTree(include: ['*.jar'], dir: 'libs')
! L% J9 g# ?1 ?5 F- H    implementation(name: 'wallet', ext: 'aar')
& J+ ?) V/ g; |! L8 y; U, v( e}
' R- `3 l8 n7 j$ X( ]. P2 C$ D, {1 Async project后可以在Android项目中对SDK的API进行调用:
% X/ A. o$ N. v) q8 G( n& ipackage io.bytom.community;
: X' h9 m1 B% @# F/ y1 K/ R* d3 [, _import android.app.Activity;4 v  B. S1 o' ]6 d8 D$ P2 E& B7 L
import android.os.Bundle;! P2 A, s( D5 f9 W1 R. Q" `
import android.util.Log;. U, E9 e# O+ V
import android.widget.TextView;
+ ~7 D6 n% n8 v! _4 Zimport wallet.Wallet;
. p4 U# _2 j; T2 F4 Mpublic class MainActivity extends Activity {# K6 a0 f/ s. m9 }. L, ]+ t$ ^
    @Override
: c! D4 t* i  E8 T3 T$ j+ `  g    protected void onCreate(Bundle savedInstanceState) {: [( r+ b7 p& O$ Z. c" V+ c
        super.onCreate(savedInstanceState);( t/ _9 B, Q0 t
        setContentView(R.layout.activity_main);
+ P+ o+ u9 D! |        TextView keyTextView = (TextView) findViewById(R.id.key_textview);
/ a; G# {: j0 f! B: ?) A4 O. n- W        String storagePath = getFilesDir().toString();
5 a/ n+ x- X* r: C* l+ z2 p8 q        Log.d("storagePath", storagePath);
* `2 c! J$ `* M2 N" G1 l; ]        Wallet.initWallet(storagePath);! @$ |: ?" n7 P. W8 }8 I. |$ K
        String keyResult = Wallet.createKey("Marshall", "123456");* ]2 ^3 n$ t2 l- ^1 ~. h
        Log.d("keyResult", keyResult);* e: R/ H; {. `/ x6 r0 J
        keyTextView.setText(keyResult);* a0 Z& ^' @0 }2 Z8 P8 m: j4 L* A
    }. {2 ~' i  G+ W% V/ A7 q# P
}2 N7 W+ p) q/ s. j- i0 E4 Z
iOS
/ h4 {; P* M" U! }( o通过项目target的Linked frameworks and libraries把wallet.framework添加到项目,可以在iOS项目中对SDK的API进行调用:  L" l# N1 K% v; v1 O9 ^5 y6 |# I
#import "ViewController.h") @1 b9 D% R/ n6 y- ?
#import "Wallet/Wallet.h"  // Gomobile bind generated framework
% [/ S  e. T1 b. F! J+ x@interface ViewController ()% Y* }2 U) D9 d4 B) @6 [! D
@end
/ Y, ]( v5 }# f@implementation ViewController3 B" I6 T: E8 j
@synthesize textLabel;" o4 S3 B- a. S( b+ D
- (void)loadView {* ~& D5 D2 Y9 r( l0 k; B
    [super loadView];# X, d5 X" F4 o8 c2 c0 N% B
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
9 f1 N5 r# w/ n0 W. Q+ Y    WalletInitWallet(docPath);$ w+ n% _! s* o' P4 k7 E# K
    textLabel.text = WalletCreateKey(@"kevin",@"123456");: {7 A/ e3 K" |0 `
}7 g8 u7 Z$ m2 M% G+ k
@end
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2