Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom移动端钱包SDK开发基础

yuan081608
2388 0 0
比原项目仓库:" x2 t3 G" y1 d* V$ Z
Github地址:https://github.com/Bytom/bytom; b) E, L' ?3 ?/ \  V! [8 T& ?
Gitee地址:https://gitee.com/BytomBlockchain/bytom
: b. D0 L2 q8 ^4 ^Bytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包层代码进行了改造。使用gomobile可以将代码 编译成Android和iOS平台可用的SDK,使用编译后的Android和iOS钱包SDK可以在移动端实现创建bytom密钥、账户、地址和交易签名功能。+ |5 s2 t* k" u0 |7 t$ J
Bytom-Mobile-Wallet-SDK源码简介5 Y0 f# D7 G' O! `4 q7 {5 Y
SDK源码放在项目的sdk文件夹中,android和ios文件夹是使用SDK的demo项目,bind.go 中首字母大写可以外部调用的函数会作为提供给Android和iOS调用的API。bytom创建的密钥对会存储在磁盘单独的文件中,而且对私钥进行了加密,账户地址数据是存储在go实现的leveldb中,所以Android和iOS平台也需要提供数据存储的路径。
% v: g& w) V: Mfunc InitWallet(storagePath string) {  x4 S) m" _/ X* ?' o
    hsm := pseudohsm.New(storagePath). l% ~# t) n7 w0 l! E2 q
    walletDB := db.NewDB("wallet", "leveldb", storagePath)0 x, s" m& f( Z$ \3 I* |
    accounts := account.NewManager(walletDB)* p1 Z9 `0 {( _6 Y( G
    assets := asset.NewRegistry(walletDB)% \# T1 ]0 N( A8 N$ e
    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm)
5 Z; [5 @2 @2 L0 D. W: a    api = aApi.API{Wallet: wallet}
! a1 o; \  E4 O, i" O; ]}" d7 E/ j! x! K5 T' u
Android和iOS平台调用其他钱包API的之前需要先调用InitWallet这个API,参数是磁盘上的绝对路径,InitWallet会对整个钱包进行一个初始化, 其中最重要是初始化leveldb的存储。其他的CreateKey、CreateAccount、CreateAccountReceiver是创建密钥、账户、地址等API,RestoreWallet API能够对钱包所有账户地址资产进行备份导出json格式的数据。3 x& @" `% a4 n2 O. X0 Q8 J) h
Bytom-Mobile-Wallet-SDK的编译
- B$ j3 L0 R6 O0 \SDK代码的编译首先需要正确的安装golang和gomobile,golang需要1.7以上版本。
& K% W6 I) K( C% @+ lAndroid平台需要安装JDK、Android SDK、Android NDK,并且需要将Android SDK的platform-tools、ndk-bundle 添加到PATH系统环境变量中。iOS平台编译环境配置相对比较简单只需要安装Xcode就可以了。
9 u9 w/ r/ p. K% T7 Z8 TClone项目到本地$GOPATH/src下:
/ w4 X1 T( ~  |1 T( T% U' D8 n git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile/ V; Q. q2 U' l) l+ j* K9 d& ?
Android
4 ^6 @4 z: D7 K" _$ `  y+ m# Vgomobile init -ndk ~/path/to/your/ndk
7 W* g) U, ]0 e+ V$ u* t* Hcd $GOPATH/src/github.com/bytom-community/mobile
1 }/ K3 [; H, v+ N  J0 p( k' V  sgomobile bind -target=android github.com/bytom-community/mobile/sdk/2 M: N4 Y# W: i. w) L0 |: H8 b
如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-s参数:
& b# k9 F1 M6 ]* j  a3 E% Ggomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/
# n5 \! u( s# {# V执行指令后会在mobile文件夹生成wallet.aar和wallet-sources.jar文件。
/ O* s% |8 d. |4 j- |0 y' _) J6 viOS
; m( J% i' Z3 @! tcd $GOPATH/src/github.com/bytom-community/mobile) Q& L9 H  C" }8 P
gomobile bind -target=ios github.com/bytom-community/mobile/sdk/
8 K( \) y* B. T如果需要减小SDK的体积给gomobile bind指令加上-ldflags=-w参数:
/ N! P! q6 ]' T% E$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/8 i5 ^3 t( U. A& _, {5 I
执行指令后会在mobile文件夹生成wallet.framework文件。
( h4 q( P8 A* f5 _- n由于gomobile现在没有支持bitcode,所以生成的iOS SDK也不支持bitcode。
6 L9 v+ N6 c$ h6 P5 ]Bytom-Mobile-Wallet-SDK的使用
1 I1 m& l' y7 n1 v' ?+ e" B8 [Android* M7 U, K! z* Q, v3 V
拷贝wallet.aar和wallet-sources.ja到Android项目的app的libs文件夹下,并在app module中的build.gradle文件中添加:
) I4 v9 Y! T9 Oandroid {
8 j$ ~% f6 Z7 ?; Z    repositories {/ a2 M, Z) |+ Q0 {& U6 g; r0 t
        flatDir { dirs 'libs' }' \2 i4 g% m" D; c" a
    }5 O9 Q: A$ s+ S. Q  t5 x8 P
}, n' h9 j3 l; j9 x! [6 P3 i/ F$ h: u
dependencies {4 [, L' d, S( \# @1 ?
    implementation fileTree(include: ['*.jar'], dir: 'libs')  h: w- _8 e2 a/ b! x' R' z, y7 t
    implementation(name: 'wallet', ext: 'aar')# S) b# ^& n. [3 N) x9 M. F
}
! [$ P1 c" G# Wsync project后可以在Android项目中对SDK的API进行调用:0 F5 i; M6 w# f, D
package io.bytom.community;, {9 d$ @  b" k
import android.app.Activity;
( D" E  L6 K& S' Kimport android.os.Bundle;+ L" @, ?' ^& ^  A$ R& S
import android.util.Log;
' W+ O: S9 w* limport android.widget.TextView;$ s7 L4 u3 H% d% K8 ~
import wallet.Wallet;  h5 Y! N7 {5 M, b7 e( ^
public class MainActivity extends Activity {2 U" Q! h9 o* z$ A  _% y, `
    @Override
9 _5 f, a( J+ Z    protected void onCreate(Bundle savedInstanceState) {& V1 ^# V( H6 `& }
        super.onCreate(savedInstanceState);% Q: I5 w, @7 M4 B/ J+ z- L
        setContentView(R.layout.activity_main);
/ ]8 f0 _. Z0 ^( H. |( P& l        TextView keyTextView = (TextView) findViewById(R.id.key_textview);, J3 i5 J, S4 X. f
        String storagePath = getFilesDir().toString();
& C, i3 y5 M" M, r3 \        Log.d("storagePath", storagePath);
4 S5 W+ k* c% r/ f, Q7 I$ A/ B        Wallet.initWallet(storagePath);
0 b: M& S1 E: r1 ?        String keyResult = Wallet.createKey("Marshall", "123456");# `2 z: K& K9 [$ j, I
        Log.d("keyResult", keyResult);6 E$ r& d1 t* ?" U  l
        keyTextView.setText(keyResult);: x% i1 p9 a6 t% ~4 |! [7 n0 P
    }
7 P: p' k- I! y3 c5 a}
; N, t& c( s8 ?! t7 r  B. ziOS0 W& T3 |5 ^  t1 Y
通过项目target的Linked frameworks and libraries把wallet.framework添加到项目,可以在iOS项目中对SDK的API进行调用:2 r' E8 y* S/ y$ F& s
#import "ViewController.h"" G- m& t7 b2 \/ j
#import "Wallet/Wallet.h"  // Gomobile bind generated framework
' q" [' }: m# u8 Z5 }@interface ViewController ()
' K+ `3 K( L( T2 y0 w@end
' g4 O* g: s( P( V& j% G@implementation ViewController
& c. F. ]# o3 K* e- L@synthesize textLabel;/ q' ?* U4 C8 W% F8 z3 S0 e
- (void)loadView {
# M4 D  o5 u7 e$ I, I    [super loadView];$ k) D9 h) G: P: o& x: l# O
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
! j) l) y5 j4 `5 u' H; }    WalletInitWallet(docPath);2 Z( V8 w% V9 Z% x8 U
    textLabel.text = WalletCreateKey(@"kevin",@"123456");
0 M8 Z* U# s; z6 K- \}5 W$ m1 y  z& G  X
@end
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2