Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom移动端钱包SDK开发基础

yuan081608
2389 0 0
比原项目仓库:8 d6 p5 h2 s8 L, T1 d# A: q' U' z
Github地址:https://github.com/Bytom/bytom
# X( C6 m6 P; vGitee地址:https://gitee.com/BytomBlockchain/bytom+ R; p+ Q1 Q- d) W
Bytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包层代码进行了改造。使用gomobile可以将代码 编译成Android和iOS平台可用的SDK,使用编译后的Android和iOS钱包SDK可以在移动端实现创建bytom密钥、账户、地址和交易签名功能。
7 _% L1 L: ~. k. C% UBytom-Mobile-Wallet-SDK源码简介. |  {, Y+ s4 g5 K3 Z
SDK源码放在项目的sdk文件夹中,android和ios文件夹是使用SDK的demo项目,bind.go 中首字母大写可以外部调用的函数会作为提供给Android和iOS调用的API。bytom创建的密钥对会存储在磁盘单独的文件中,而且对私钥进行了加密,账户地址数据是存储在go实现的leveldb中,所以Android和iOS平台也需要提供数据存储的路径。
! P/ L5 }0 R/ y& d7 f8 Xfunc InitWallet(storagePath string) {+ z' f# h# d+ r' @" {0 q  Y+ C
    hsm := pseudohsm.New(storagePath)
  v0 k* Z  s, y: u5 m4 }1 N, n    walletDB := db.NewDB("wallet", "leveldb", storagePath)
. V2 N; n: \) E7 D4 a6 T    accounts := account.NewManager(walletDB): y  i% }5 O8 _4 Y3 d; w
    assets := asset.NewRegistry(walletDB)
- H# T& Q5 o( U8 z1 R' m, s    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm)2 Y; B" O. d9 g
    api = aApi.API{Wallet: wallet}
$ [( j* b: H" h. ^: R0 U8 E}
8 A9 V  [! c. x7 C: H9 }Android和iOS平台调用其他钱包API的之前需要先调用InitWallet这个API,参数是磁盘上的绝对路径,InitWallet会对整个钱包进行一个初始化, 其中最重要是初始化leveldb的存储。其他的CreateKey、CreateAccount、CreateAccountReceiver是创建密钥、账户、地址等API,RestoreWallet API能够对钱包所有账户地址资产进行备份导出json格式的数据。
) X2 N1 J  c1 U( T! WBytom-Mobile-Wallet-SDK的编译
% x2 S  s( {& P3 y: J% C3 t( o6 ?SDK代码的编译首先需要正确的安装golang和gomobile,golang需要1.7以上版本。2 \" M( G- g; T+ E* ~0 H' r  o
Android平台需要安装JDK、Android SDK、Android NDK,并且需要将Android SDK的platform-tools、ndk-bundle 添加到PATH系统环境变量中。iOS平台编译环境配置相对比较简单只需要安装Xcode就可以了。
) ^9 v$ Z1 A1 }) E- {Clone项目到本地$GOPATH/src下:
9 a- {* A/ `6 b( a7 C; R git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile' Q$ D. B: K: G' b
Android  L. s! F0 s# R7 `6 z
gomobile init -ndk ~/path/to/your/ndk
! Q  Z6 H. C' u& t, b' O8 h- Lcd $GOPATH/src/github.com/bytom-community/mobile
4 \) S' Z6 r9 R$ k5 s/ S9 c1 _gomobile bind -target=android github.com/bytom-community/mobile/sdk/
4 n# e2 J9 m0 f3 u* _# `如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-s参数:& ]$ D+ K/ B% J; h" F  w
gomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/
3 H8 K& ~. I& c: O执行指令后会在mobile文件夹生成wallet.aar和wallet-sources.jar文件。: s( Y$ J+ m& e# a- x+ X2 X
iOS
: n* q% s( S; e8 B" j; m4 F1 Ucd $GOPATH/src/github.com/bytom-community/mobile3 _& }4 u) R* ]: u* m. B9 U+ P" N
gomobile bind -target=ios github.com/bytom-community/mobile/sdk/
3 O; g" ~% b" J$ }如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-w参数:
6 L( J6 a9 R, ]: M6 P8 J9 M& u/ o; F7 q7 t$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/
- u! L& k  M5 g5 _执行指令后会在mobile文件夹生成wallet.framework文件。. ]" M4 S( ~9 E7 v/ E' S' Z, E6 h
由于gomobile现在没有支持bitcode,所以生成的iOS SDK也不支持bitcode。
1 \5 n* h. \# S4 B0 ZBytom-Mobile-Wallet-SDK的使用7 x1 ~1 ?3 d9 D$ a; \
Android7 i1 v& \8 |" r1 L' N; }7 p& J0 @
拷贝wallet.aar和wallet-sources.ja到Android项目的app的libs文件夹下,并在app module中的build.gradle文件中添加:
6 q0 K6 A* `7 f+ X3 u% q9 uandroid {
, o0 v7 h: \* k8 i' S5 f( R    repositories {3 a0 |" p4 q$ X/ \6 K9 k% V
        flatDir { dirs 'libs' }
3 Z9 f# a7 ~1 u8 U3 t, W* T7 G% p    }5 C. R( n: \) k" b
}
0 X5 J" F- `; r! ^# ?: U& n2 fdependencies {6 l# l' X2 A: m, S' Q2 J
    implementation fileTree(include: ['*.jar'], dir: 'libs')$ g3 I1 J4 e7 d. J4 ]. a/ W
    implementation(name: 'wallet', ext: 'aar')+ f3 K7 V/ l" _. t/ X6 C
}
/ H: q4 ?+ t& f3 i$ U1 Y+ `sync project后可以在Android项目中对SDK的API进行调用:
! M) V* N" K7 Q: `$ ?- Epackage io.bytom.community;
- \' ]. Q3 _' q* x9 f, dimport android.app.Activity;! m; U% O& F# _  u- N& E
import android.os.Bundle;
3 i% H/ l0 T" O- A3 H. aimport android.util.Log;
- T% h2 s8 q2 k! Y: Q! q7 K* p" Zimport android.widget.TextView;
5 P5 e5 z% _. x5 Jimport wallet.Wallet;2 b; ~, l4 A: n! b* Q
public class MainActivity extends Activity {
* |0 r8 @+ i1 |8 p    @Override) J8 i5 o" N, j; w! a) T( H# `
    protected void onCreate(Bundle savedInstanceState) {
, B  x0 z* [- U; v. V        super.onCreate(savedInstanceState);
/ Q  w( n+ Q1 v) l. v        setContentView(R.layout.activity_main);
. T: C* t, \7 N; H        TextView keyTextView = (TextView) findViewById(R.id.key_textview);1 s* s" {2 U4 i5 M2 X* L' }7 u5 ]7 X
        String storagePath = getFilesDir().toString();0 _: Z$ h% E" l4 l7 x8 _
        Log.d("storagePath", storagePath);, s8 Q2 P. X# Q! _! c
        Wallet.initWallet(storagePath);. B9 w8 [2 @+ U' }8 l
        String keyResult = Wallet.createKey("Marshall", "123456");
9 d8 F- q: B# e$ x        Log.d("keyResult", keyResult);
" r0 h  r0 ^; M# M8 B- I        keyTextView.setText(keyResult);. U9 y9 _# B$ V1 }8 d9 T
    }% `0 G2 S4 f0 ^- k
}7 m, ?+ h3 d. ]
iOS
' o0 c7 `3 T7 p  }; R) c3 U, L* h3 Z) d  _通过项目target的Linked frameworks and libraries把wallet.framework添加到项目,可以在iOS项目中对SDK的API进行调用:8 {% b0 ~! d4 B
#import "ViewController.h"
1 ?1 T' [0 L' d, g% T/ C' u#import "Wallet/Wallet.h"  // Gomobile bind generated framework4 B) c; C- A; \
@interface ViewController ()' A; G. b0 Y. w. i( {# C
@end
4 U4 _" N2 r7 r@implementation ViewController/ E+ X- o, P% K4 U% f$ t
@synthesize textLabel;
0 U3 e3 z2 A6 v+ }$ A& {5 i- (void)loadView {% ~- B$ J% Q$ e. E. S: S
    [super loadView];
. v" }; @5 o7 x4 ]  X; Y# E/ t9 @; G3 I    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
+ _+ u' C7 M. L" n3 p. L    WalletInitWallet(docPath);6 ]  J# R+ J) O4 Q/ H. D4 m
    textLabel.text = WalletCreateKey(@"kevin",@"123456");5 {+ `; E* [0 F; u
}$ d, d: J' }$ b" `$ q3 e
@end
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2