Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom移动端钱包SDK开发基础

yuan081608
2342 0 0
比原项目仓库:5 f; C8 l% y! T! l# d0 `2 n+ y
Github地址:https://github.com/Bytom/bytom
) e( g2 O9 I* a% Y; A8 ?; l9 \: QGitee地址:https://gitee.com/BytomBlockchain/bytom9 g" K) h$ R! v- Q  A* X
Bytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包层代码进行了改造。使用gomobile可以将代码 编译成Android和iOS平台可用的SDK,使用编译后的Android和iOS钱包SDK可以在移动端实现创建bytom密钥、账户、地址和交易签名功能。1 ]) r4 d% p$ I* o
Bytom-Mobile-Wallet-SDK源码简介
3 ^( d+ W( C' }SDK源码放在项目的sdk文件夹中,android和ios文件夹是使用SDK的demo项目,bind.go 中首字母大写可以外部调用的函数会作为提供给Android和iOS调用的API。bytom创建的密钥对会存储在磁盘单独的文件中,而且对私钥进行了加密,账户地址数据是存储在go实现的leveldb中,所以Android和iOS平台也需要提供数据存储的路径。
: G7 w# B7 G6 A& O# s; ~func InitWallet(storagePath string) {
: Y* {  J3 d0 O1 s    hsm := pseudohsm.New(storagePath)( G0 c( |' H3 S9 q9 e
    walletDB := db.NewDB("wallet", "leveldb", storagePath)
# s% z7 [0 O5 Q5 ^( ~" r; w    accounts := account.NewManager(walletDB)  y0 P" Z5 }) {  H6 t! T8 K
    assets := asset.NewRegistry(walletDB)2 q$ \1 I# Y, g/ S! I) N* G
    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm)
3 c: y7 |/ E" b& D, k, B6 E    api = aApi.API{Wallet: wallet}) b% K7 T, c% _# p& k
}5 E, N4 @9 t5 x6 }
Android和iOS平台调用其他钱包API的之前需要先调用InitWallet这个API,参数是磁盘上的绝对路径,InitWallet会对整个钱包进行一个初始化, 其中最重要是初始化leveldb的存储。其他的CreateKey、CreateAccount、CreateAccountReceiver是创建密钥、账户、地址等API,RestoreWallet API能够对钱包所有账户地址资产进行备份导出json格式的数据。
. v0 [6 E; n) u+ [+ @Bytom-Mobile-Wallet-SDK的编译6 O$ A' ~$ f" X
SDK代码的编译首先需要正确的安装golang和gomobile,golang需要1.7以上版本。- e1 p; R, T) T" ~0 T
Android平台需要安装JDK、Android SDK、Android NDK,并且需要将Android SDK的platform-tools、ndk-bundle 添加到PATH系统环境变量中。iOS平台编译环境配置相对比较简单只需要安装Xcode就可以了。9 e" W& J9 q+ ^7 i  E% B
Clone项目到本地$GOPATH/src下:
) W0 }) c+ K) S3 P9 H, b git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile
$ n0 V4 }, w! X& v6 MAndroid
% O2 p' M2 |. d$ x' H1 P8 Kgomobile init -ndk ~/path/to/your/ndk
5 ~" `% H8 _, N( f: U2 g( Ccd $GOPATH/src/github.com/bytom-community/mobile1 u: }$ Z" U2 p
gomobile bind -target=android github.com/bytom-community/mobile/sdk/
. |  K  o. Q2 d3 F如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-s参数:
. R: W, h& ?' D8 m* Wgomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/
1 k  t7 P+ a4 ^. `1 y执行指令后会在mobile文件夹生成wallet.aar和wallet-sources.jar文件。
- U& r, e0 H  F( BiOS. C' e: u7 P) p2 \  V2 j
cd $GOPATH/src/github.com/bytom-community/mobile
. K& v8 Z5 y6 @' j1 _gomobile bind -target=ios github.com/bytom-community/mobile/sdk/2 X2 C! ~0 g5 f$ Q+ |$ k9 j) O
如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-w参数:
, F7 h5 \( t  b$ ~4 d: G2 Q$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/
/ ~) z/ f: E  P执行指令后会在mobile文件夹生成wallet.framework文件。
- [) B) I6 i2 W由于gomobile现在没有支持bitcode,所以生成的iOS SDK也不支持bitcode。; g, a$ `' \$ e$ C- U! ?8 R
Bytom-Mobile-Wallet-SDK的使用9 q: e5 s/ g" D' c% `
Android. d0 ]: \8 h) i% ~4 [
拷贝wallet.aar和wallet-sources.ja到Android项目的app的libs文件夹下,并在app module中的build.gradle文件中添加:1 r/ H) b) ]+ |0 o$ H
android {5 Q0 U  [1 ?* D
    repositories {
, t7 X* S6 B5 L# r) J3 {  _4 |        flatDir { dirs 'libs' }
* Y* r( @4 X3 C% s9 E% r. f! t7 m1 s    }5 Y: [* g* a# n2 C- @8 l
}: [0 w2 x1 d, ~4 f, X6 z
dependencies {
" j2 h: Y* ~) Y1 ^. i0 J7 d, O    implementation fileTree(include: ['*.jar'], dir: 'libs')
; k" d1 ?8 w* l8 R    implementation(name: 'wallet', ext: 'aar')% A8 `9 R: ]' l1 @, }: k7 b
}
# O0 n. b' Y' H$ Ysync project后可以在Android项目中对SDK的API进行调用:7 d9 m5 Z) P/ K8 {4 H
package io.bytom.community;, Q; p6 p+ r: @( A5 f; |7 m/ @/ C
import android.app.Activity;
$ p3 |+ g, }5 F1 L7 k( Dimport android.os.Bundle;* R' _+ {: }. q9 X
import android.util.Log;: E8 v- {' U+ C; N- m* @0 z
import android.widget.TextView;
1 t5 [- c$ `1 J8 B# q6 T8 b( v/ S0 Aimport wallet.Wallet;. y; F$ [% x! }* V1 d/ w/ w2 j
public class MainActivity extends Activity {
) c* r4 F5 p  c4 ]  d  X# Y    @Override
; i/ V) L8 x4 _: _4 E# @    protected void onCreate(Bundle savedInstanceState) {9 N9 o' U; D7 Z; f! W
        super.onCreate(savedInstanceState);9 v5 ?1 o  D2 c( q
        setContentView(R.layout.activity_main);8 o' Q) _- G7 w' @- B7 X5 j
        TextView keyTextView = (TextView) findViewById(R.id.key_textview);+ `# V, S% C1 C+ c
        String storagePath = getFilesDir().toString();
( @: y) g# s) U# q        Log.d("storagePath", storagePath);. B$ l9 C3 y7 X  R5 c8 U; M
        Wallet.initWallet(storagePath);! G* ?! T1 E/ t: o- ^% X. Y6 O0 j3 b
        String keyResult = Wallet.createKey("Marshall", "123456");
; D/ f4 v0 x& [4 B6 z, v        Log.d("keyResult", keyResult);
2 l2 V- u. x& f8 v+ W        keyTextView.setText(keyResult);
8 F% n3 Y% g* w3 ?1 I8 R    }5 g& t1 s. H$ r+ |; f
}
' E3 W( a* C' u! h' H/ I! E7 viOS6 M$ N! Z* n9 u7 }7 v3 k9 \
通过项目target的Linked frameworks and libraries把wallet.framework添加到项目,可以在iOS项目中对SDK的API进行调用:
) R" a) {8 a) r! i; Q7 e3 `3 e0 y#import "ViewController.h"
6 Y/ n/ L' C! g& Y#import "Wallet/Wallet.h"  // Gomobile bind generated framework! S' B& t8 Q  Y- t1 `- M
@interface ViewController ()
8 I! A  {; D- G4 F@end) \5 j1 G, E$ l' _7 n+ T7 |. s
@implementation ViewController
: G4 C* a! Z3 B& N@synthesize textLabel;
( K! a6 N0 N+ U* Z$ c3 g% [! ]- (void)loadView {2 ^- b9 b2 {# ?; S
    [super loadView];
! t# j5 d0 f7 S: @; _    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
+ _/ f" g2 }4 Y+ K+ I* m    WalletInitWallet(docPath);( C' t! P9 Z( N: C' o1 q3 J
    textLabel.text = WalletCreateKey(@"kevin",@"123456");
2 C5 c2 B' c1 i& M}
  k) o3 r2 ?( J+ m0 r' k@end
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2