Bytom移動端錢包SDK開發基礎

比原鏈Bytom發表於2018-09-10

比原專案倉庫:

Github地址:https://github.com/Bytom/bytom

Gitee地址:https://gitee.com/BytomBlockchain/bytom

Bytom-Mobile-Wallet-SDK 是從bytom原始碼中抽離出的錢包層程式碼,並且對錢包層程式碼進行了改造。使用gomobile可以將程式碼 編譯成Android和iOS平臺可用的SDK,使用編譯後的Android和iOS錢包SDK可以在移動端實現建立bytom金鑰、賬戶、地址和交易簽名功能。

Bytom-Mobile-Wallet-SDK原始碼簡介

SDK原始碼放在專案的sdk資料夾中,android和ios資料夾是使用SDK的demo專案,bind.go 中首字母大寫可以外部呼叫的函式會作為提供給Android和iOS呼叫的API。bytom建立的金鑰對會儲存在磁碟單獨的檔案中,而且對私鑰進行了加密,賬戶地址資料是儲存在go實現的leveldb中,所以Android和iOS平臺也需要提供資料儲存的路徑。

func InitWallet(storagePath string) {
    hsm := pseudohsm.New(storagePath)
    walletDB := db.NewDB("wallet", "leveldb", storagePath)
    accounts := account.NewManager(walletDB)
    assets := asset.NewRegistry(walletDB)
    wallet := aWallet.NewWallet(walletDB, accounts, assets, hsm)
    api = aApi.API{Wallet: wallet}
}

Android和iOS平臺呼叫其他錢包API的之前需要先呼叫InitWallet這個API,引數是磁碟上的絕對路徑,InitWallet會對整個錢包進行一個初始化, 其中最重要是初始化leveldb的儲存。其他的CreateKey、CreateAccount、CreateAccountReceiver是建立金鑰、賬戶、地址等API,RestoreWallet API能夠對錢包所有賬戶地址資產進行備份匯出json格式的資料。

Bytom-Mobile-Wallet-SDK的編譯

SDK程式碼的編譯首先需要正確的安裝golang和gomobile,golang需要1.7以上版本。
Android平臺需要安裝JDK、Android SDK、Android NDK,並且需要將Android SDK的platform-tools、ndk-bundle 新增到PATH系統環境變數中。iOS平臺編譯環境配置相對比較簡單隻需要安裝Xcode就可以了。
Clone專案到本地$GOPATH/src下:

 git clone https://github.com/Bytom-Community/Bytom-Mobile-Wallet-SDK $GOPATH/src/github.com/bytom-community/mobile

Android

gomobile init -ndk ~/path/to/your/ndk
cd $GOPATH/src/github.com/bytom-community/mobile
gomobile bind -target=android github.com/bytom-community/mobile/sdk/

如果需要減小SDK的體積給gomobile bind指令加上-ldflags=-s引數:

gomobile bind -target=android -ldflags=-s github.com/bytom-community/mobile/sdk/

執行指令後會在mobile資料夾生成wallet.aar和wallet-sources.jar檔案。

iOS

cd $GOPATH/src/github.com/bytom-community/mobile
gomobile bind -target=ios github.com/bytom-community/mobile/sdk/

如果需要減小SDK的體積給gomobile bind指令加上-ldflags=-w引數:

$ gomobile bind -target=ios -ldflags=-w github.com/bytom-community/mobile/sdk/

執行指令後會在mobile資料夾生成wallet.framework檔案。
由於gomobile現在沒有支援bitcode,所以生成的iOS SDK也不支援bitcode。

Bytom-Mobile-Wallet-SDK的使用

Android

拷貝wallet.aar和wallet-sources.ja到Android專案的app的libs資料夾下,並在app module中的build.gradle檔案中新增:

android {
    repositories {
        flatDir { dirs 'libs' }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation(name: 'wallet', ext: 'aar')
}

sync project後可以在Android專案中對SDK的API進行呼叫:

package io.bytom.community;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;


import wallet.Wallet;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView keyTextView = (TextView) findViewById(R.id.key_textview);

        String storagePath = getFilesDir().toString();
        Log.d("storagePath", storagePath);

        Wallet.initWallet(storagePath);
        String keyResult = Wallet.createKey("Marshall", "123456");
        Log.d("keyResult", keyResult);
        keyTextView.setText(keyResult);
    }
}

iOS

通過專案target的Linked frameworks and libraries把wallet.framework新增到專案,可以在iOS專案中對SDK的API進行呼叫:

#import "ViewController.h"
#import "Wallet/Wallet.h"  // Gomobile bind generated framework

@interface ViewController ()
@end

@implementation ViewController

@synthesize textLabel;

- (void)loadView {
    [super loadView];
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    WalletInitWallet(docPath);
    textLabel.text = WalletCreateKey(@"kevin",@"123456");
}

@end

相關文章