如何开发以太坊(Android)钱包系列2-导入帐户和帐户管理
浏览:806 次

最新内容将在主网站上更新
原始链接:
这是如何开发以太坊(Android)钱包系列以及如何导入帐户的第二部分。有时用户可能已经有了帐户。本文将介绍如何导入现有帐户。
导入账户准备知识
从用户需求的角度来看,需要导入用户的现有帐户。然而,在安全方面,当您使用非官方和非开源钱包产品(尤其是小众钱包)时,或者当您没有仔细保存私钥、助记符和Keysotre文件时。
正确的方法是提示用户:
在新钱包中创建一个新的钱包帐户并进行安全备份(因为前一个可能不安全);
然后将所有硬币转移到旧钱包中的新帐户。
有三种方法可以导入帐户:
通过私钥导入
通过KeyStore导入
通过助记符导入
通过私钥导入帐户
密钥是用用户输入的私钥创建一个椭圆曲线密钥对,然后用这个密钥对创建一个钱包。代码如下:
(代码位于中的app/src/pro/upchain/wallet/utils/ETHWalletUtils.java文件中)
public static ETHWallet loadWalletByPrivateKey(字符串私有密钥,字符串密码){
凭据凭据=空;
ECKeyPair ECKeyPair=ECKeyPair.create(Numeric.toBigInt(私钥));
返回generateWallet(generateNewWalletName(),pwd,ecKeyPair);
}
如前所述,return语句中的generateWallet()通过椭圆曲线密钥对创建钱包。
loadWalletByPrivateKey()中第二个参数的密码pwd在使用私钥生成帐户的过程中不需要pwd。它用于加密和保存私钥,即生成密钥库文件。
通过KeyStore文件导入帐户
对于KeyStore文件,如果您不理解,可以阅读它。
关键步骤:
KeyStore文本内容解析WalletFile实例;
使用密码解码WalletFile生成椭圆曲线密钥对来创建钱包。
/**
*@param keystore原始json文件内容
*@param pwd密钥库解密密码

*@返回
*/
公共静态ETHWallet loadWalletByKeystore(String keystore,String pwd){
尝试{
钱包文件钱包文件=空;
walletFile=对象映射器。readValue(密钥库,WalletFile.class);
返回generateWallet(generateNewWalletName(),pwd,Wallet)。解密(pwd,walletFile));
}catch(IOException e){
}catch(CipherException e){
}
返回null;
}
通过助记符导入帐户
导入和创建非常相似。不同的是,种子是由用户提供的助记符生成的。
当使用助记符导入帐户时,用户还需要选择(或输入)下推路径(参考)。关键步骤包括:
通过助记符创建随机数种子;
通过种子+路径派生生成私钥来创建钱包;
/**
*通过导入助记符导入钱包
*
*@参数路径bip44路径
*@参数列表助记符
*@param密码
*@返回
*/
公共静态ETHWallet importMnemonic(字符串路径,字符串助记符,字符串pwd){
列表
如果(!path.startsWith(“m”)&!路径启动方式(“M”){
//非法参数
返回null;

}
String[]pathArray=路径.split(“/”);
如果(pathArray.length<=1){
//错误的内容
返回null;
}
字符串密码=“”;
long creationTimeSeconds=系统。当前时间毫秒()/1000;
DeterministicSeed ds=新的DeterminlisticSeed(列表,空,密码,创建时间秒);
返回generateWalletByMnemonic(generateNewWalletName(),ds,pathArray,pwd);
}
GenerateWalletByMnemonic已引入,
帐户存储(保存到数据库)
许多学生一定注意到,无论账户如何构建,它最终都将被构建为ETHWallet钱包对象。他的定义如下:
@实体
公共类ETHWallet{
@Id(自动增量=真)
私有长id;
public String地址;
私有字符串名称;
private String密码;//加密的密码
private String keystorePath;
私有字符串助记符;
私有布尔值isCurrent;//是当前选定的钱包吗
私有布尔值isBackup;//是否已备份
}
之前构建的ETHWallet仅存在于内容中。app退出后,此数据将丢失,因此我们需要将其序列化为
它存储在序列化数据库中。下次进入app时,将加载数据库并还原帐户。
绿色DAO
GreenDAO是一种将对象映射到SQLite数据的方法