摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列導(dǎo)入賬號(hào)及賬號(hào)管理原文已更新,請(qǐng)讀者前往原文閱讀這是如何開發(fā)一款以太坊安卓錢包系列第篇,如何導(dǎo)入賬號(hào)。提示大家閱讀本文時(shí),最好把代碼庫克隆到本地對(duì)照閱讀。
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:以太坊(安卓)錢包系列2 - 導(dǎo)入賬號(hào)及賬號(hào)管理原文已更新,請(qǐng)讀者前往原文閱讀
這是如何開發(fā)一款以太坊(安卓)錢包系列第2篇,如何導(dǎo)入賬號(hào)。有時(shí)用戶可能已經(jīng)有一個(gè)賬號(hào),這篇文章接來介紹下,如何實(shí)現(xiàn)導(dǎo)入用戶已經(jīng)存在的賬號(hào)。
導(dǎo)入賬號(hào)預(yù)備知識(shí)從用戶需求上來講,導(dǎo)入用戶已經(jīng)存在的賬號(hào)是有必要的。 不過從安全性考慮,當(dāng)你之前使用的是一個(gè)非官方、非開源的錢包產(chǎn)品時(shí)(尤其是小眾錢包),或者之前沒有對(duì)私鑰、助記詞、Keysotre文件小心保存時(shí)。
正確的做法是提示用戶:
在新的錢包重新創(chuàng)建一個(gè)錢包賬號(hào)、并安全備份(因?yàn)橹暗目赡芤呀?jīng)不安全);
然后在老錢包里把所有的幣轉(zhuǎn)移到新賬號(hào)。
導(dǎo)入賬號(hào)有3種方式:
通過私鑰導(dǎo)入
通過KeyStore 導(dǎo)入
通過助記詞導(dǎo)入
通過私鑰導(dǎo)入賬號(hào)關(guān)鍵是用用戶輸入的私鑰創(chuàng)建一個(gè)橢圓曲線秘鑰對(duì),然后用這個(gè)秘鑰對(duì)創(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)建賬號(hào) 已經(jīng)介紹過,通過橢圓曲線秘鑰對(duì)創(chuàng)建錢包。
loadWalletByPrivateKey()中第2個(gè)參數(shù)密碼pwd,在私鑰生成賬號(hào)這個(gè)過程并不需要pwd,它是用來加密保存私鑰,即為了生成keystore文件。
通過KeyStore文件導(dǎo)入賬號(hào)關(guān)于KeyStore文件,不了解的可以閱讀下賬號(hào)Keystore文件導(dǎo)入導(dǎo)出。
關(guān)鍵步驟:
KeyStore 文本內(nèi)容解析WalletFile實(shí)例;
使用密碼 解碼 WalletFile 生成橢圓曲線秘鑰對(duì)創(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; }通過助記詞導(dǎo)入賬號(hào)
導(dǎo)入和上一篇中,創(chuàng)建非常相似,不同的是,種子由用戶提供的助記詞生成。
使用助記詞導(dǎo)入賬號(hào)時(shí),還需要用戶選擇(或輸入)一個(gè)推倒路徑(參考BIP44),關(guān)鍵步驟是:
通過助記詞創(chuàng)建隨機(jī)數(shù)種子;
通過 種子 + 路徑 派生生成私鑰 創(chuàng)建錢包 ;
/** * 通過導(dǎo)入助記詞,導(dǎo)入錢包 * * @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)容不對(duì) 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)介紹過,
賬號(hào)存儲(chǔ)(保存到數(shù)據(jù)庫)很多同學(xué)肯定已經(jīng)注意到, 不管通過什么方式構(gòu)造的賬號(hào),都會(huì)最終構(gòu)造為一個(gè)ETHWallet 錢包對(duì)象,他的定義如下:
@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; // 是否是當(dāng)前選中的錢包 private boolean isBackup; // 是否備份過 }
前面構(gòu)造的ETHWallet是只存在于內(nèi)容之中, 在應(yīng)用程序退出之后,這個(gè)數(shù)據(jù)將丟失, 因此我們需要把它序列化到
序列化數(shù)據(jù)庫中存儲(chǔ)起來,在下一次進(jìn)入應(yīng)用的時(shí)候加載數(shù)據(jù)庫還原出賬號(hào)。
greenDAO 是一個(gè)將對(duì)象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案,以下是一個(gè)greenDAO的作用示意圖:
這里我們也使用了 greenDAO 來把ETHWallet對(duì)象映射到 SQLite 數(shù)據(jù)庫, greenDAO的用法這里只簡單說明,不詳細(xì)闡述,大家可以跟隨官方提供的introduction 和 how-to-get-started。
對(duì)象映射保存把ETHWallet映射的到數(shù)據(jù)庫,需要給類加上@Entity注解,這樣greenDAO會(huì)生成幾個(gè)類:DaoMaster、DaoSession及 ETHWalletDao 幫我們完成構(gòu)建數(shù)據(jù)庫表等操作。
在使用ETHWalletDao插入到數(shù)據(jù)庫之前需要先進(jìn)行一個(gè)初始化,通常初始化放在應(yīng)用程序入口中進(jìn)行,如: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實(shí)例, 前面不管是新創(chuàng)建還是導(dǎo)入的賬號(hào)都會(huì)構(gòu)造這樣一個(gè)實(shí)例。
多賬號(hào)管理考慮到用戶可能會(huì)創(chuàng)建多個(gè)賬號(hào),因此需要確定一個(gè)當(dāng)前選定的賬號(hào),一般情況下,用戶新創(chuàng)建的賬號(hào)應(yīng)該作為當(dāng)前選中的的賬號(hào),同時(shí)其他賬號(hào)應(yīng)該取消選中, 我們完善下賬號(hào)存儲(chǔ)邏輯, 如下:
(代碼在代碼庫中的app/src/pro/upchain/wallet/utils/WalletDaoUtils.java文件中)
/** * 插入新創(chuàng)建錢包 * * @param ethWallet 錢 */ public static void insertNewWallet(ETHWallet ethWallet) { updateCurrent(-1); // 取消其他站賬號(hào)選中狀態(tài) ethWallet.setCurrent(true); ethWalletDao.insert(ethWallet); } /** * 更新選中錢包 * * @param id 錢包ID */ public static ETHWallet updateCurrent(long id) { // 加載所有錢包賬號(hào) List打通賬號(hào)創(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; }
以通過私鑰導(dǎo)入賬號(hào)進(jìn)行保存為例,把創(chuàng)建賬號(hào)和保存賬號(hào)打通,這里我們使用響應(yīng)式編程 ReactiveX,
這部分作為訂閱者福利,發(fā)表在我的小專欄,趁還未漲價(jià),趕緊訂閱吧,超值的!
RxAndroid 了解更多響應(yīng)式編程
introduction 和 how-to-get-started 了解greenDAO。
我創(chuàng)建了一個(gè)專門討論錢包開發(fā)的微信群,加微信:xlbxiong 備注:錢包。
加入知識(shí)星球,和一群優(yōu)秀的區(qū)塊鏈從業(yè)者一起學(xué)習(xí)。
深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/24620.html
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列通過助記詞創(chuàng)建賬號(hào)原文已更新,請(qǐng)讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時(shí)間不到已經(jīng)快到。的功能和類似,它是比特幣協(xié)議的實(shí)現(xiàn),他實(shí)現(xiàn)了及相關(guān)協(xié)議。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創(chuàng)建賬號(hào)原文已更新,請(qǐng)讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時(shí)間不到已經(jīng)快到10...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接以太坊安卓錢包系列通過助記詞創(chuàng)建賬號(hào)原文已更新,請(qǐng)讀者前往原文閱讀上周我開源了一款錢包,反映很好,一周時(shí)間不到已經(jīng)快到。的功能和類似,它是比特幣協(xié)議的實(shí)現(xiàn),他實(shí)現(xiàn)了及相關(guān)協(xié)議。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊(安卓)錢包系列1 - 通過助記詞創(chuàng)建賬號(hào)原文已更新,請(qǐng)讀者前往原文閱讀 上周我開源了一款錢包,反映很好,一周時(shí)間不到已經(jīng)快到10...
摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...
摘要:這是如何開發(fā)以太坊安卓錢包系列第篇,錢包賬號(hào)資產(chǎn)信息展示,展示信息主要包括賬號(hào)地址余額及該賬號(hào)所擁有的及余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:開發(fā)以太坊安卓錢包系列第3篇,原文已更新,請(qǐng)讀者前往原文閱讀 請(qǐng)大家前往深入淺出區(qū)塊鏈主站, 獲取最新內(nèi)容。 這是如何開發(fā)以太坊(安卓)錢包系列第3篇, 錢包賬號(hào)資產(chǎn)信息展示,展示信息主要包括賬號(hào)地址、eth余額及該賬號(hào)所擁有的Token...
摘要:這是如何開發(fā)以太坊安卓錢包系列第篇,錢包賬號(hào)資產(chǎn)信息展示,展示信息主要包括賬號(hào)地址余額及該賬號(hào)所擁有的及余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:開發(fā)以太坊安卓錢包系列第3篇,原文已更新,請(qǐng)讀者前往原文閱讀 請(qǐng)大家前往深入淺出區(qū)塊鏈主站, 獲取最新內(nèi)容。 這是如何開發(fā)以太坊(安卓)錢包系列第3篇, 錢包賬號(hào)資產(chǎn)信息展示,展示信息主要包括賬號(hào)地址、eth余額及該賬號(hào)所擁有的Token...
閱讀 3772·2023-04-25 20:09
閱讀 3921·2022-06-28 19:00
閱讀 3299·2022-06-28 19:00
閱讀 3322·2022-06-28 19:00
閱讀 3463·2022-06-28 19:00
閱讀 3097·2022-06-28 19:00
閱讀 3367·2022-06-28 19:00
閱讀 2892·2022-06-28 19:00