Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

An Ethereum wallet based on web3j,plus a bitcoin wallet based on bitcoinj

Notifications You must be signed in to change notification settings

alanqjt/ETHWallet

Repository files navigation

ETHWallet

此项目为以前个人区块链钱包项目抽出的部分,其中包含ETH钱包生成、导入等基础功能,以及BTC钱包地址生成过程和使用的算法。感谢前人的探索,这里只是总结,希望对你有所帮助。

目录

效果演示

部分界面效果




关于ETH钱包

此项目基于web3j开发的一个android的ETHWallet,其中包含了助记词生成、创建钱包、导入钱包等基础方法。 使用原生web3j生成ECKeyPair的时候 低端机型(华为P6)会闪退,原因是算法复杂度高,CPU使用过高,java运行的速度慢。解决方法把当需要调用web3j 调用SCrypt.scrypt()方法的时候把java算法换成使用JNI C库中的代码

创建钱包

EthWalletManager wManager = new EthWalletManager();
wManager.createWallet(walletName, password, passwordHit, false, new EthWalletCallBack() {
 @Override
 public void onSuccessCallBack(EthWallet ethWallet, String fileName, String walletAddress, String storeText) throws Exception {
 }
 @Override
 public void onErrorCallBack(Exception e) {
 }
});

导入钱包

//三种方法导入
EthWalletManager wManager = new EthWalletManager(); 
ECKeyPair ecKeyPair = wManager.generateECKeyPairByMnemonicWords(mnemonicWordsInAList, password);//助记词导入钱包 
ECKeyPair ecKeyPair = wManager.generateECKeyPairByKeyStore(keystore_content, password) //keystore导入钱包 
ECKeyPair ecKeyPair = wManager.generateECKeyPairByPK(pk_text, password);//私钥导入钱包 
wManager.importWallet(ecKeyPair, walletName, password, passwordHit, mnemonicWords, new EthWalletCallBack() {
 @Override
 public void onSuccessCallBack(EthWallet ethWallet, String fileName, String walletAddress, String storeText) throws Exception {
 }
 @Override
 public void onErrorCallBack(Exception e) {
 }
});

助记词说明

如果想把助记词换成日文、法文、中文等(自己在BIP39,wordlists包创建),Japanese.INSTANCE 或者 French.INSTANCE

 
//随机生成助记词 
StringBuilder sb = new StringBuilder();
byte[] entropy = new byte[Words.TWELVE.byteLength()];// 12个 英文单词
new SecureRandom().nextBytes(entropy);
new MnemonicGenerator(English.INSTANCE).createMnemonic(entropy, sb::append);
System.out.println(sb.toString());
String[] parts = sb.toString().split(" ");

BTC资料

bitcoin地址是如何生成的

获取测试比特币(科学上网)

查询测试比特币余额

地址意义说明

BTC钱包地址生成过程

如果有兴趣 可运行 BtcTest Module 中的com.alan.btctest.TestBtc

BtcWallet btcWallet = new BtcWallet();
//助记词种子 byte 
byte[] seed = getSeed(mnemonicWordsInAList); 
DeterministicSeed deterministicSeed = new DeterministicSeed(mnemonicWordsInAList, seed, "", 0); 
DeterministicKeyChain deterministicKeyChain = DeterministicKeyChain.builder().seed(deterministicSeed).build(); 
//这里运用了BIP44里面提到的算法, 44'是固定的, 后面的一个0'代表的是币种BTC 
//EIP85 提议 以太坊 路径为 : m/44'/60'/a'/0/n
//这里 的 a 表示帐号,n 是第 n 生成的地址,60 是在 SLIP44 提案中暂定的,因为 BIP44 只定义到 0 - 31。 
byte[] privKeyBTC = deterministicKeyChain.getKeyByPath(parsePath("M/44/0/0/0/" + n), true).getPrivKeyBytes(); 
// 比特币创建的钱包 与连接的网有关,如果选TestNet生成的地址一般是以 N \M 开头,MainNet生成的地址是以 1 \ 3开头 
ECKey ecKey = ECKey.fromPrivate(privKeyBTC); 
String publickey = Numeric.toHexStringNoPrefixZeroPadded(new BigInteger(ecKey.getPubKey()), 66);
String privateKey = ecKey.getPrivateKeyEncoded(MainNetParams.get()).toString();
System.out.println(" ----------------主钱包的 主公私钥 和地址---------------------------");
System.out.println("主 address:" + ecKey.toAddress(MainNetParams.get()).toBase58());
System.out.println("测 address:" + ecKey.toAddress(TestNet3Params.get()).toBase58());
System.out.println(" publickey:" + publickey.length());
System.out.println(" publickey:" + publickey);
System.out.println(" privateKey:" + privateKey.length());
System.out.println(" privateKey:" + privateKey);
System.out.println("head=" + MainNetParams.get().getAddressHeader());
System.out.println("-----------------通过公钥获取地址--------------------------");
String testNetAddress = getAddress(publickey, true, false);
System.out.println("-----------------Testnet pub key n/m开头--------------------------");
String mainNetAddress_Standard_Public = getAddress(publickey, false, false);
System.out.println("-----------------P2PKH address 1开头--------------------------");
String mainNetAddress_Multi_Signature = getAddress(publickey, false, true);
System.out.println("-----------------P2SH address 3开头--------------------------");

About

An Ethereum wallet based on web3j,plus a bitcoin wallet based on bitcoinj

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /