成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何開發(fā)一款以太坊(安卓)錢包系列2 - 導入賬號及賬號管理

Tecode / 1015人閱讀

摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列導入賬號及賬號管理原文已更新,請讀者前往原文閱讀這是如何開發(fā)一款以太坊安卓錢包系列第篇,如何導入賬號。提示大家閱讀本文時,最好把代碼庫克隆到本地對照閱讀。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:以太坊(安卓)錢包系列2 - 導入賬號及賬號管理原文已更新,請讀者前往原文閱讀

這是如何開發(fā)一款以太坊(安卓)錢包系列第2篇,如何導入賬號。有時用戶可能已經(jīng)有一個賬號,這篇文章接來介紹下,如何實現(xiàn)導入用戶已經(jīng)存在的賬號。

導入賬號預備知識

從用戶需求上來講,導入用戶已經(jīng)存在的賬號是有必要的。 不過從安全性考慮,當你之前使用的是一個非官方、非開源的錢包產(chǎn)品時(尤其是小眾錢包),或者之前沒有對私鑰、助記詞、Keysotre文件小心保存時。
正確的做法是提示用戶:

在新的錢包重新創(chuàng)建一個錢包賬號、并安全備份(因為之前的可能已經(jīng)不安全);

然后在老錢包里把所有的幣轉(zhuǎn)移到新賬號。

導入賬號有3種方式:

通過私鑰導入

通過KeyStore 導入

通過助記詞導入

通過私鑰導入賬號

關(guān)鍵是用用戶輸入的私鑰創(chuàng)建一個橢圓曲線秘鑰對,然后用這個秘鑰對創(chuàng)建錢包,代碼如下:
(代碼在代碼庫中的app/src/pro/upchain/wallet/utils/ETHWalletUtils.java文件中)

    public static ETHWallet loadWalletByPrivateKey(String privateKey, String pwd) {
        Credentials credentials = null;
        ECKeyPair ecKeyPair = ECKeyPair.create(Numeric.toBigInt(privateKey));
        return generateWallet(generateNewWalletName(), pwd, ecKeyPair);
    }

返回語句中的 generateWallet(),在系列1-通過助記詞創(chuàng)建賬號 已經(jīng)介紹過,通過橢圓曲線秘鑰對創(chuàng)建錢包。

loadWalletByPrivateKey()中第2個參數(shù)密碼pwd,在私鑰生成賬號這個過程并不需要pwd,它是用來加密保存私鑰,即為了生成keystore文件。

通過KeyStore文件導入賬號

關(guān)于KeyStore文件,不了解的可以閱讀下賬號Keystore文件導入導出。

關(guān)鍵步驟:

KeyStore 文本內(nèi)容解析WalletFile實例;

使用密碼 解碼 WalletFile 生成橢圓曲線秘鑰對創(chuàng)建錢包。

    /**

     * @param keystore 原json文件內(nèi)容
     * @param pwd      keystore解密密碼
     * @return
     */
    public static ETHWallet loadWalletByKeystore(String keystore, String pwd) {
        try {
            WalletFile walletFile = null;
            walletFile = objectMapper.readValue(keystore, WalletFile.class);
            return generateWallet(generateNewWalletName(), pwd, Wallet.decrypt(pwd, walletFile));
        } catch (IOException e) {
        } catch (CipherException e) {
        }
        return null;
    }
通過助記詞導入賬號

導入和上一篇中,創(chuàng)建非常相似,不同的是,種子由用戶提供的助記詞生成。

使用助記詞導入賬號時,還需要用戶選擇(或輸入)一個推倒路徑(參考BIP44),關(guān)鍵步驟是:

通過助記詞創(chuàng)建隨機數(shù)種子;

通過 種子 + 路徑 派生生成私鑰 創(chuàng)建錢包 ;

    /**
     * 通過導入助記詞,導入錢包
     *
     * @param path bip44路徑
     * @param list 助記詞
     * @param pwd  密碼
     * @return
     */
    public static ETHWallet importMnemonic(String path, String mnemonic, String pwd) {
        List  list =  Arrays.asList(mnemonic.split(" "));
        if (!path.startsWith("m") && !path.startsWith("M")) {
            //參數(shù)非法
            return null;
        }
        String[] pathArray = path.split("/");
        if (pathArray.length <= 1) {
            //內(nèi)容不對
            return null;
        }
        String passphrase = "";
        long creationTimeSeconds = System.currentTimeMillis() / 1000;
        DeterministicSeed ds = new DeterministicSeed(list, null, passphrase, creationTimeSeconds);
        return generateWalletByMnemonic(generateNewWalletName(), ds, pathArray, pwd);
    }

generateWalletByMnemonic在上一篇中已經(jīng)介紹過,

賬號存儲(保存到數(shù)據(jù)庫)

很多同學肯定已經(jīng)注意到, 不管通過什么方式構(gòu)造的賬號,都會最終構(gòu)造為一個ETHWallet 錢包對象,他的定義如下:

@Entity
public class ETHWallet {

    @Id(autoincrement = true)
    private Long id;

    public String address;
    private String name;
    private String password;   // 經(jīng)過加密后的pwd
    private String keystorePath;  
    private String mnemonic;   
    private boolean isCurrent;   // 是否是當前選中的錢包
    private boolean isBackup;    // 是否備份過
}

前面構(gòu)造的ETHWallet是只存在于內(nèi)容之中, 在應用程序退出之后,這個數(shù)據(jù)將丟失, 因此我們需要把它序列化到
序列化數(shù)據(jù)庫中存儲起來,在下一次進入應用的時候加載數(shù)據(jù)庫還原出賬號。

greenDAO

greenDAO 是一個將對象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案,以下是一個greenDAO的作用示意圖:

這里我們也使用了 greenDAO 來把ETHWallet對象映射到 SQLite 數(shù)據(jù)庫, greenDAO的用法這里只簡單說明,不詳細闡述,大家可以跟隨官方提供的introduction 和 how-to-get-started。

對象映射保存

把ETHWallet映射的到數(shù)據(jù)庫,需要給類加上@Entity注解,這樣greenDAO會生成幾個類:DaoMaster、DaoSessionETHWalletDao 幫我們完成構(gòu)建數(shù)據(jù)庫表等操作。

在使用ETHWalletDao插入到數(shù)據(jù)庫之前需要先進行一個初始化,通常初始化放在應用程序入口中進行,如:pro.upchain.wallet.UpChainWalletApp的onCreate()中執(zhí)行,初始化代碼如下:

protected void init() {
    DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(this, "wallet", null);
    SQLiteDatabase db = mHelper.getWritableDatabase();
    DaoSession daoSession = new DaoMaster(db).newSession();
    ETHWalletDao ethWalletDao = daoSession.getETHWalletDao();
}

有了greenDAO為我們生成的輔助類,插入到數(shù)據(jù)庫就很簡單了,一行代碼:

ethWalletDao.insert(ethWallet);  // 

ethWallet為ETHWallet實例, 前面不管是新創(chuàng)建還是導入的賬號都會構(gòu)造這樣一個實例。

多賬號管理

考慮到用戶可能會創(chuàng)建多個賬號,因此需要確定一個當前選定的賬號,一般情況下,用戶新創(chuàng)建的賬號應該作為當前選中的的賬號,同時其他賬號應該取消選中, 我們完善下賬號存儲邏輯, 如下:
(代碼在代碼庫中的app/src/pro/upchain/wallet/utils/WalletDaoUtils.java文件中)

    /**
     * 插入新創(chuàng)建錢包
     *
     * @param ethWallet 錢
     */
    public static void insertNewWallet(ETHWallet ethWallet) {
        updateCurrent(-1);  // 取消其他站賬號選中狀態(tài)
        ethWallet.setCurrent(true);
        ethWalletDao.insert(ethWallet);
    }
    

    /**
     * 更新選中錢包
     *
     * @param id 錢包ID
     */
    public static ETHWallet updateCurrent(long id) {
    // 加載所有錢包賬號
        List ethWallets = ethWalletDao.loadAll();
        ETHWallet currentWallet = null;
        for (ETHWallet ethwallet : ethWallets) {
            if (id != -1 && ethwallet.getId() == id) {
                ethwallet.setCurrent(true);
                currentWallet = ethwallet;
            } else {
                ethwallet.setCurrent(false);
            }
            ethWalletDao.update(ethwallet);
        }
        return currentWallet;
    }
打通賬號創(chuàng)建與保存

以通過私鑰導入賬號進行保存為例,把創(chuàng)建賬號和保存賬號打通,這里我們使用響應式編程 ReactiveX,
這部分作為訂閱者福利,發(fā)表在我的小專欄,趁還未漲價,趕緊訂閱吧,超值的!

學習資料

RxAndroid 了解更多響應式編程

introduction 和 how-to-get-started 了解greenDAO。

我創(chuàng)建了一個專門討論錢包開發(fā)的微信群,加微信:xlbxiong 備注:錢包。

加入知識星球,和一群優(yōu)秀的區(qū)塊鏈從業(yè)者一起學習。
深入淺出區(qū)塊鏈 - 系統(tǒng)學習區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24620.html

相關(guān)文章

  • 如何開發(fā)一款以太安卓錢包系列1 - 通過助記詞創(chuàng)建賬號

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到。的功能和類似,它是比特幣協(xié)議的實現(xiàn),他實現(xiàn)了及相關(guān)協(xié)議。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到10...

    genefy 評論0 收藏0
  • 如何開發(fā)一款以太安卓錢包系列1 - 通過助記詞創(chuàng)建賬號

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到。的功能和類似,它是比特幣協(xié)議的實現(xiàn),他實現(xiàn)了及相關(guān)協(xié)議。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到10...

    bbbbbb 評論0 收藏0
  • 區(qū)塊鏈技術(shù)學習指引

    摘要:引言給迷失在如何學習區(qū)塊鏈技術(shù)的同學一個指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應用于比特幣,還有非常多的現(xiàn)實應用場景,想做區(qū)塊鏈應用開發(fā),可進一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學習指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評論0 收藏0
  • 如何開發(fā)一款以太安卓錢包系列3 - 資產(chǎn)信息展示

    摘要:這是如何開發(fā)以太坊安卓錢包系列第篇,錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址余額及該賬號所擁有的及余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:開發(fā)以太坊安卓錢包系列第3篇,原文已更新,請讀者前往原文閱讀 請大家前往深入淺出區(qū)塊鏈主站, 獲取最新內(nèi)容。 這是如何開發(fā)以太坊(安卓)錢包系列第3篇, 錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token...

    asce1885 評論0 收藏0
  • 如何開發(fā)一款以太安卓錢包系列3 - 資產(chǎn)信息展示

    摘要:這是如何開發(fā)以太坊安卓錢包系列第篇,錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址余額及該賬號所擁有的及余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:開發(fā)以太坊安卓錢包系列第3篇,原文已更新,請讀者前往原文閱讀 請大家前往深入淺出區(qū)塊鏈主站, 獲取最新內(nèi)容。 這是如何開發(fā)以太坊(安卓)錢包系列第3篇, 錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token...

    taohonghui 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<