摘要:本文首發(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) { Listlist = 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 是一個將對象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案,以下是一個greenDAO的作用示意圖:
這里我們也使用了 greenDAO 來把ETHWallet對象映射到 SQLite 數(shù)據(jù)庫, greenDAO的用法這里只簡單說明,不詳細闡述,大家可以跟隨官方提供的introduction 和 how-to-get-started。
對象映射保存把ETHWallet映射的到數(shù)據(jù)庫,需要給類加上@Entity注解,這樣greenDAO會生成幾個類:DaoMaster、DaoSession及 ETHWalletDao 幫我們完成構(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打通賬號創(chuàng)建與保存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)建賬號和保存賬號打通,這里我們使用響應式編程 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
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到。的功能和類似,它是比特幣協(xié)議的實現(xiàn),他實現(xiàn)了及相關(guān)協(xié)議。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到10...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到。的功能和類似,它是比特幣協(xié)議的實現(xiàn),他實現(xiàn)了及相關(guān)協(xié)議。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創(chuàng)建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經(jīng)快到10...
摘要:引言給迷失在如何學習區(qū)塊鏈技術(shù)的同學一個指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應用于比特幣,還有非常多的現(xiàn)實應用場景,想做區(qū)塊鏈應用開發(fā),可進一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學習指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...
摘要:這是如何開發(fā)以太坊安卓錢包系列第篇,錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址余額及該賬號所擁有的及余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:開發(fā)以太坊安卓錢包系列第3篇,原文已更新,請讀者前往原文閱讀 請大家前往深入淺出區(qū)塊鏈主站, 獲取最新內(nèi)容。 這是如何開發(fā)以太坊(安卓)錢包系列第3篇, 錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token...
摘要:這是如何開發(fā)以太坊安卓錢包系列第篇,錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址余額及該賬號所擁有的及余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:開發(fā)以太坊安卓錢包系列第3篇,原文已更新,請讀者前往原文閱讀 請大家前往深入淺出區(qū)塊鏈主站, 獲取最新內(nèi)容。 這是如何開發(fā)以太坊(安卓)錢包系列第3篇, 錢包賬號資產(chǎn)信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token...
閱讀 3538·2023-04-25 20:09
閱讀 3739·2022-06-28 19:00
閱讀 3060·2022-06-28 19:00
閱讀 3081·2022-06-28 19:00
閱讀 3175·2022-06-28 19:00
閱讀 2880·2022-06-28 19:00
閱讀 3047·2022-06-28 19:00
閱讀 2638·2022-06-28 19:00