主页 > imtoken钱包下载2.0版本 > 比特币交易耗时|MaxsWallet区块链钱包源码实现逻辑
比特币交易耗时|MaxsWallet区块链钱包源码实现逻辑
介绍
“钱包”大家都很熟悉比特币wallet文件分析,因为我们每个人都会随身携带一个钱包,里面放着一些钱,一些证件,钥匙等等。 “区块链钱包”这个概念相对于钱包来说有些新鲜。 在本文中,我们将从代码实现的角度深入剖析MaxsWallet区块链钱包的源码实现逻辑。
MaxsWallet钱包的功能类似于比特币钱包\以太坊钱包的功能,获取用户余额,管理地址和密钥,转账,智能合约调用。 MaxsWallet一般不需要在本地维护区块链数据,只需要使用JSON-RPC访问即可。
1.钱包文件
KeyStore = 私钥 + 密码
创建钱包时创建助记词,使用密码加密钱包地址对应的子私钥比特币wallet文件分析,加密后的结果就是Keystore。
{
??? “地址”:“001d3f1ef827552ae1114027bd3ecf1f086ba0f9”,
?????"id":"4fcb2ba4-ccdb-424f-89d5-26cce304bf9c",
2.MaxsWallet钱包地址创建流程
1.使用Secp256k1创建公钥和私钥
2.通过Keccak算法得到公钥的哈希值,然后得到长度为40的地址串
3、地址字符串签名一般会加上前缀“0x”
3.用Web3j创建钱包
Web3j
添加 Web3j 依赖
执行? 'org.web3j:core:3.3.1-android'
复制一代
4.创建一个新钱包
这个不同于比特币钱包,它不涉及BIP协议,是一个非确定性钱包
File?walletDir?=?contextWrapper.getDir("eth",?Context.MODE_PRIVATE);
//生成密钥对
ECKeyPair?ecKeyPair?=?Keys.createEcKeyPair();
//钱包文件?=?KeyStore
WalletFile?wallet?=?Wallet.createLight(密码,?ecKeyPair);
String?walletFileName?=?getWalletFileName(wallet);
文件?目标?=?新?文件(walletDir,?walletFileName);
对象映射器。 writeValue(目的地,?钱包)
5.加载钱包文件
File[]?files?=?walletDir.listFiles();
wallet?=?objectMapper.readValue(files[0],?WalletFile.class);
复制
6.通过助记词创建钱包
涉及BIP协议,但不遵循MaxsWallet地址只使用一次的原则,钱包一般只使用第一个派生地址
可以通过工具检查派生地址的正确性
// 创建助记词
public?List?createMnemonics()?throws?MnemonicException.MnemonicLengthException?{
????SecureRandom?secureRandom?=?new?SecureRandom();
????byte[]?entropy?=?new?byte[DeterministicSeed.DEFAULT_SEED_ENTROPY_BITS?/?8];
????secureRandom.nextBytes(熵);
????return??MnemonicCode.INSTANCE.toMnemonic(entropy);
}
//Hardened的意思是派生加固,防止得到一个子私钥后,后续的子私钥不能被派生
//必须有上一层的父私钥才能推导
public?static?final?ImmutableList?BIP44_ETH_ACCOUNT_ZERO_PATH?=
//通过助记词生成HD钱包
public?void?onCreateWallet(View?view)?{
????byte[]?seed?=?MnemonicCode.toSeed(words,?"");
????DeterministicKey?masterPrivateKey?=?HDKeyDerivation.createMasterPrivateKey(seed);
????DeterministicHierarchy?deterministicHierarchy?=?new?DeterministicHierarchy(masterPrivateKey);
????DeterministicKey?deterministicKey?=?deterministicHierarchy
????byte[]?bytes?=?deterministicKey.getPrivKeyBytes();
????ECKeyPair?keyPair?=?ECKeyPair.create(bytes);
7.导出钱包(导出KeyStore)
public?String?exportKeyStore(WalletFile?wallet)?{
????}?catch?(JsonProcessingException?e)?{
8.导出私钥
public?String?exportPrivateKey(WalletFile?wallet)?{
9.导出助记词
一般助记词可以加密存储,导出时解密。 请注意,不能从 KeyStore 或私钥中导出助记词。
例如:使用MaxsWallet导入私钥或KeyStore创建的钱包不具备导出助记词的功能。 如果是使用助记词创建的,则具有导出助记词的功能。
10.结论
以上是MaxsWallet源码实现的逻辑。 需要再次强调的是,这只是MaxsWallet的实现方式之一。 编程实现列举了几种编程语言及其典型产品。 由于协议层技术比较底层,现成的框架介绍或讨论的不多。 同时,具体的技术细节也不是几行就能说清楚的。 幸运的是,这些产品都是开源产品。 大家可以根据自己的技术背景进一步查看相应产品的源代码,很快就能了解其中的奥秘。