Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom移动端钱包SDK开发基础

yuan081608
2387 0 0
比原项目仓库:
! O: G. C- o% T* ]Github地址:https://github.com/Bytom/bytom. V8 }- S/ J1 P$ Z8 P3 r$ @9 S. _
Gitee地址:https://gitee.com/BytomBlockchain/bytom  a- ]; C4 R# A
Bytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包层代码进行了改造。使用gomobile可以将代码 编译成Android和iOS平台可用的SDK,使用编译后的Android和iOS钱包SDK可以在移动端实现创建bytom密钥、账户、地址和交易签名功能。
# B$ `% |) n( V5 l2 a; R% p2 @' FBytom-Mobile-Wallet-SDK源码简介" B( w8 N/ k: k7 R3 F
SDK源码放在项目的sdk文件夹中,android和ios文件夹是使用SDK的demo项目,bind.go 中首字母大写可以外部调用的函数会作为提供给Android和iOS调用的API。bytom创建的密钥对会存储在磁盘单独的文件中,而且对私钥进行了加密,账户地址数据是存储在go实现的leveldb中,所以Android和iOS平台也需要提供数据存储的路径。
: v( E7 D- T9 mfunc InitWallet(storagePath string) {
2 j" I( f' g. V9 f    hsm := pseudohsm.New(storagePath); w/ d8 }2 b; j) v
    walletDB := db.NewDB("wallet", "leveldb", storagePath)1 J$ B5 G4 Z& t' F; E6 l; m
    accounts := account.NewManager(walletDB)4 s# t$ e; I* T) u0 V" R
    assets := asset.NewRegistry(walletDB)& a$ {# ?$ \3 z' Q
    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm)! m3 z4 D9 N% @% d- @6 ?* t9 W" g
    api = aApi.API{Wallet: wallet}
% i& F! T& {, E) r}/ M* X# j4 ?9 y% I2 s1 W
Android和iOS平台调用其他钱包API的之前需要先调用InitWallet这个API,参数是磁盘上的绝对路径,InitWallet会对整个钱包进行一个初始化, 其中最重要是初始化leveldb的存储。其他的CreateKey、CreateAccount、CreateAccountReceiver是创建密钥、账户、地址等API,RestoreWallet API能够对钱包所有账户地址资产进行备份导出json格式的数据。
1 P! ~; ?& i4 h4 X+ j" rBytom-Mobile-Wallet-SDK的编译% T" X9 Z$ A& U6 r9 W7 X
SDK代码的编译首先需要正确的安装golang和gomobile,golang需要1.7以上版本。
) n- B+ M5 T3 I) M: ZAndroid平台需要安装JDK、Android SDK、Android NDK,并且需要将Android SDK的platform-tools、ndk-bundle 添加到PATH系统环境变量中。iOS平台编译环境配置相对比较简单只需要安装Xcode就可以了。* o& V" i& E/ l) C; ^9 R# V
Clone项目到本地$GOPATH/src下:
% t/ [/ _* ]/ i6 } git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile( t& s, W8 n8 M8 q9 v
Android
' W2 m6 x! ]! G) [1 Mgomobile init -ndk ~/path/to/your/ndk4 @! y, o2 l8 j* D6 x4 q
cd $GOPATH/src/github.com/bytom-community/mobile
# k. r6 D. ]7 b. ~  @7 T) E+ Cgomobile bind -target=android github.com/bytom-community/mobile/sdk/3 R. f& m1 V& F
如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-s参数:/ D4 M( V% R  L4 W" o5 @
gomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/
% |& m; n" q- d2 L" f执行指令后会在mobile文件夹生成wallet.aar和wallet-sources.jar文件。" S) X- t0 q9 e& o
iOS
$ Z* g$ N0 m$ B/ Scd $GOPATH/src/github.com/bytom-community/mobile. D; r" P" e, ^
gomobile bind -target=ios github.com/bytom-community/mobile/sdk/
- E8 N- x# Z3 U6 p如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-w参数:
6 D: L% W# q8 i- U$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/
' Q* N7 {* Z+ D8 u+ i+ g) D4 y执行指令后会在mobile文件夹生成wallet.framework文件。9 {7 }3 k% {$ E+ h5 U8 P0 G
由于gomobile现在没有支持bitcode,所以生成的iOS SDK也不支持bitcode。7 |5 `) Y. X, K6 ]" J( I* X
Bytom-Mobile-Wallet-SDK的使用
  M% h, A7 N% t9 S- G! Q2 Q9 s! uAndroid
7 G1 L. `; g* z7 s1 L/ M拷贝wallet.aar和wallet-sources.ja到Android项目的app的libs文件夹下,并在app module中的build.gradle文件中添加:
# z2 p4 M. H- u6 H; i, Z( h: tandroid {
( A; O$ F/ e, y$ w1 Q& V0 \% `# f, _    repositories {! X0 J& c9 F  I) O
        flatDir { dirs 'libs' }
/ G8 [8 R) y- m$ \  W5 y    }
7 y' w3 K& r% V% J4 P}; z/ A# ^4 x$ x4 n5 C
dependencies {- u& j5 S# [+ g$ ]8 Q: M  {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
. `2 m  e) _4 h! @9 F$ ^    implementation(name: 'wallet', ext: 'aar')
$ Y. \7 I' Q  I) \2 O2 L& ^}/ R3 D$ s9 o; ~& R
sync project后可以在Android项目中对SDK的API进行调用:
; d* p, e" N: w% z- ]package io.bytom.community;
- q$ J0 g4 H! l: Z, t4 w$ T( f$ nimport android.app.Activity;
' B3 G4 d8 J2 ?% M, H& O% I( r. ?import android.os.Bundle;
1 v, [6 g# ?4 z+ f0 q; V: I+ ]6 }import android.util.Log;
6 N6 N! N; n$ zimport android.widget.TextView;4 n+ c' s# b5 |7 _1 y. b0 ]) S
import wallet.Wallet;' l) s" `; \1 g0 S4 A; z/ q. V. `
public class MainActivity extends Activity {
1 X2 \) U! F5 `) A    @Override
! |  I  p6 i) M& `# b8 e    protected void onCreate(Bundle savedInstanceState) {+ N& v3 U- r6 W: y4 b
        super.onCreate(savedInstanceState);
- y% Y6 c7 K* u4 ]# Q        setContentView(R.layout.activity_main);" c5 L: n( z  [2 L; {+ |' m( L8 X
        TextView keyTextView = (TextView) findViewById(R.id.key_textview);" [# h- p$ O+ K  I1 }. J  c
        String storagePath = getFilesDir().toString();
" o: u8 J0 K. F# ^- u        Log.d("storagePath", storagePath);( y4 C# X: H5 W/ L3 I# R9 `
        Wallet.initWallet(storagePath);
8 Q: ~3 h# @; ^( |9 W% C( {        String keyResult = Wallet.createKey("Marshall", "123456");
4 A) p" U# m* J) M        Log.d("keyResult", keyResult);
# m9 ?2 M( `/ z) Q; z        keyTextView.setText(keyResult);  u* n* o  F8 Z" m
    }+ N3 t: }# ]2 G/ j' |; k% {
}7 g: d8 B6 B1 @& ]
iOS, X# H+ [4 l" c5 U8 X; e0 \
通过项目target的Linked frameworks and libraries把wallet.framework添加到项目,可以在iOS项目中对SDK的API进行调用:
. H, N9 v3 _& L#import "ViewController.h"4 p' X7 w5 G# C. O) b4 F
#import "Wallet/Wallet.h"  // Gomobile bind generated framework6 B1 z& R& {: S  \5 U
@interface ViewController ()6 X/ k6 Q) D2 r7 S2 D
@end
* H  m8 M8 N/ O. M: T7 W@implementation ViewController+ l8 b4 V! o" a: }% G( U
@synthesize textLabel;: b/ n0 Z2 s- e% _% D6 p
- (void)loadView {
4 N5 A) A6 ~. [  r9 ^5 v  Q    [super loadView];
$ P+ k8 S% ]9 j7 ~1 T! z    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];- R; R% Q3 Y& g, o# K! _
    WalletInitWallet(docPath);5 c  q; c5 t/ E3 b3 f8 v$ r
    textLabel.text = WalletCreateKey(@"kevin",@"123456");0 K3 u; w- O8 k# V
}) \9 P  y! q0 e; Z
@end
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2