摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊安卓錢包系列導入賬號及賬號管理原文已更新,請讀者前往原文閱讀這是如何開發一款以太坊安卓錢包系列第篇,如何導入賬號。提示大家閱讀本文時,最好把代碼庫克隆到本地對照閱讀。
本文首發于深入淺出區塊鏈社區
原文鏈接:以太坊(安卓)錢包系列2 - 導入賬號及賬號管理原文已更新,請讀者前往原文閱讀
這是如何開發一款以太坊(安卓)錢包系列第2篇,如何導入賬號。有時用戶可能已經有一個賬號,這篇文章接來介紹下,如何實現導入用戶已經存在的賬號。
導入賬號預備知識從用戶需求上來講,導入用戶已經存在的賬號是有必要的。 不過從安全性考慮,當你之前使用的是一個非官方、非開源的錢包產品時(尤其是小眾錢包),或者之前沒有對私鑰、助記詞、Keysotre文件小心保存時。
正確的做法是提示用戶:
在新的錢包重新創建一個錢包賬號、并安全備份(因為之前的可能已經不安全);
然后在老錢包里把所有的幣轉移到新賬號。
導入賬號有3種方式:
通過私鑰導入
通過KeyStore 導入
通過助記詞導入
通過私鑰導入賬號關鍵是用用戶輸入的私鑰創建一個橢圓曲線秘鑰對,然后用這個秘鑰對創建錢包,代碼如下:
(代碼在代碼庫中的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-通過助記詞創建賬號 已經介紹過,通過橢圓曲線秘鑰對創建錢包。
loadWalletByPrivateKey()中第2個參數密碼pwd,在私鑰生成賬號這個過程并不需要pwd,它是用來加密保存私鑰,即為了生成keystore文件。
通過KeyStore文件導入賬號關于KeyStore文件,不了解的可以閱讀下賬號Keystore文件導入導出。
關鍵步驟:
KeyStore 文本內容解析WalletFile實例;
使用密碼 解碼 WalletFile 生成橢圓曲線秘鑰對創建錢包。
/** * @param keystore 原json文件內容 * @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; }通過助記詞導入賬號
導入和上一篇中,創建非常相似,不同的是,種子由用戶提供的助記詞生成。
使用助記詞導入賬號時,還需要用戶選擇(或輸入)一個推倒路徑(參考BIP44),關鍵步驟是:
通過助記詞創建隨機數種子;
通過 種子 + 路徑 派生生成私鑰 創建錢包 ;
/** * 通過導入助記詞,導入錢包 * * @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")) { //參數非法 return null; } String[] pathArray = path.split("/"); if (pathArray.length <= 1) { //內容不對 return null; } String passphrase = ""; long creationTimeSeconds = System.currentTimeMillis() / 1000; DeterministicSeed ds = new DeterministicSeed(list, null, passphrase, creationTimeSeconds); return generateWalletByMnemonic(generateNewWalletName(), ds, pathArray, pwd); }
generateWalletByMnemonic在上一篇中已經介紹過,
賬號存儲(保存到數據庫)很多同學肯定已經注意到, 不管通過什么方式構造的賬號,都會最終構造為一個ETHWallet 錢包對象,他的定義如下:
@Entity public class ETHWallet { @Id(autoincrement = true) private Long id; public String address; private String name; private String password; // 經過加密后的pwd private String keystorePath; private String mnemonic; private boolean isCurrent; // 是否是當前選中的錢包 private boolean isBackup; // 是否備份過 }
前面構造的ETHWallet是只存在于內容之中, 在應用程序退出之后,這個數據將丟失, 因此我們需要把它序列化到
序列化數據庫中存儲起來,在下一次進入應用的時候加載數據庫還原出賬號。
greenDAO 是一個將對象映射到 SQLite 數據庫中的輕量且快速的 ORM 解決方案,以下是一個greenDAO的作用示意圖:
這里我們也使用了 greenDAO 來把ETHWallet對象映射到 SQLite 數據庫, greenDAO的用法這里只簡單說明,不詳細闡述,大家可以跟隨官方提供的introduction 和 how-to-get-started。
對象映射保存把ETHWallet映射的到數據庫,需要給類加上@Entity注解,這樣greenDAO會生成幾個類:DaoMaster、DaoSession及 ETHWalletDao 幫我們完成構建數據庫表等操作。
在使用ETHWalletDao插入到數據庫之前需要先進行一個初始化,通常初始化放在應用程序入口中進行,如:pro.upchain.wallet.UpChainWalletApp的onCreate()中執行,初始化代碼如下:
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為我們生成的輔助類,插入到數據庫就很簡單了,一行代碼:
ethWalletDao.insert(ethWallet); //
ethWallet為ETHWallet實例, 前面不管是新創建還是導入的賬號都會構造這樣一個實例。
多賬號管理考慮到用戶可能會創建多個賬號,因此需要確定一個當前選定的賬號,一般情況下,用戶新創建的賬號應該作為當前選中的的賬號,同時其他賬號應該取消選中, 我們完善下賬號存儲邏輯, 如下:
(代碼在代碼庫中的app/src/pro/upchain/wallet/utils/WalletDaoUtils.java文件中)
/** * 插入新創建錢包 * * @param ethWallet 錢 */ public static void insertNewWallet(ETHWallet ethWallet) { updateCurrent(-1); // 取消其他站賬號選中狀態 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; }
以通過私鑰導入賬號進行保存為例,把創建賬號和保存賬號打通,這里我們使用響應式編程 ReactiveX,
這部分作為訂閱者福利,發表在我的小專欄,趁還未漲價,趕緊訂閱吧,超值的!
RxAndroid 了解更多響應式編程
introduction 和 how-to-get-started 了解greenDAO。
我創建了一個專門討論錢包開發的微信群,加微信:xlbxiong 備注:錢包。
加入知識星球,和一群優秀的區塊鏈從業者一起學習。
深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24620.html
摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊安卓錢包系列通過助記詞創建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經快到。的功能和類似,它是比特幣協議的實現,他實現了及相關協議。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經快到10...
摘要:本文首發于深入淺出區塊鏈社區原文鏈接以太坊安卓錢包系列通過助記詞創建賬號原文已更新,請讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時間不到已經快到。的功能和類似,它是比特幣協議的實現,他實現了及相關協議。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創建賬號原文已更新,請讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時間不到已經快到10...
摘要:這是如何開發以太坊安卓錢包系列第篇,錢包賬號資產信息展示,展示信息主要包括賬號地址余額及該賬號所擁有的及余額。 本文首發于深入淺出區塊鏈社區原文鏈接:開發以太坊安卓錢包系列第3篇,原文已更新,請讀者前往原文閱讀 請大家前往深入淺出區塊鏈主站, 獲取最新內容。 這是如何開發以太坊(安卓)錢包系列第3篇, 錢包賬號資產信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token...
摘要:這是如何開發以太坊安卓錢包系列第篇,錢包賬號資產信息展示,展示信息主要包括賬號地址余額及該賬號所擁有的及余額。 本文首發于深入淺出區塊鏈社區原文鏈接:開發以太坊安卓錢包系列第3篇,原文已更新,請讀者前往原文閱讀 請大家前往深入淺出區塊鏈主站, 獲取最新內容。 這是如何開發以太坊(安卓)錢包系列第3篇, 錢包賬號資產信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token...
閱讀 3532·2023-04-25 20:09
閱讀 3736·2022-06-28 19:00
閱讀 3056·2022-06-28 19:00
閱讀 3075·2022-06-28 19:00
閱讀 3168·2022-06-28 19:00
閱讀 2874·2022-06-28 19:00
閱讀 3038·2022-06-28 19:00
閱讀 2632·2022-06-28 19:00