区块链钱包开发(Android篇),深入解析android核心组件和应用框架

这篇具有很好参考价值的文章主要介绍了区块链钱包开发(Android篇),深入解析android核心组件和应用框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作用:

  • 1、备份更容易。按照比特币的原则,尽量不要使用同一个地址,一个地址只使用一次,这样会导致频繁备份钱包。HD钱包只需要在创建时保存主密钥,通过主密钥可以派生出所有的子密钥。

  • 2、私钥离线更安全。主私钥离线存储,主公钥在线使用,通过主公钥可以派生出所有的子公钥。例如:给每个商品提供一个收款地址。

  • 3、利于管理,权限控制。树状结构类似于公司的组织架构,可以给各个部门指定一个密钥分支。

  • 4、记账。只使用公钥即可记账。

BIP39

BIP39:将seed 用方便记忆和书写的单字表示。一般由 12 个单字组成,称为 mnemonic code(phrase),中文称为助记词或助记码。例如: average green proud remember advance trick estate oblige trouble when cube person

Wordlists

工具

BIP43

BIP43

BIP43对BIP32树结构增加了子索引标识purpose的拓展m/purpose’/*

BIP32的索引:m/0’/*

BIP44的索引:m/44’/*。

BIP44

BIP44:基于BIP32和BIP43,赋予树状结构中的各层特殊的意义。让同一个 seed 可以支援多币种、多帐户等。各层定义如下:

m / purpose’ / coin_type’ / account’ / change / address_index

  • purporse’: 固定值44’, 代表是BIP44
  • coin_type’: 这个代表的是币种, 可以兼容很多种币, 比如BTC是0’, ETH是60’, 例如:btc一般是 m/44’/0’/0’/0, eth一般是 m/44’/60’/0’/0
  • account’:账号
  • change’: 0表示外部链(External Chain),用户接收比特币,1表示内部链(Internal Chain),用于接收找零
  • address_index:钱包索引

钱包最佳实践

  • 使用助记词(BIP39)
  • 使用层级确定性钱包(HD Wallets)(BIP32)
  • 使用多目的HD Wallets(BIP43)
  • 使用多币种,多账号的HD Wallets (BIP44)

比特币钱包地址创建过程

1、生成128bit~256bit作为私钥

2、通过secp256k1椭圆曲线算法得到私钥对应的公钥

3、将公钥进行SHA-256,得到公钥Hash

4、将3的结果进行RIMEMD-160

5、将4中结果添加1个字节版本号

6、将5中结果进行两次SHA-256,取前4个字节作为checksum

7、将6中结果添加到5中结果的末尾

8、将7中结果进行Base58,结果为比特币地址

BitcoinJ创建钱包

Bitcoinj是比特币协议Java版本实现的库。

添加依赖:

dependencies {
implementation ‘org.bitcoinj:bitcoinj-core:0.14.7’
implementation ‘org.slf4j:slf4j-api:1.7.25’
implementation ‘com.squareup.okhttp3:okhttp:3.10.0’
implementation ‘com.squareup.okhttp3:logging-interceptor:3.10.0’
implementation ‘com.google.zxing:core:3.3.3’//二维码
}

Android最大方法数的限制,60K 开启multiDexEnabled

android {
compileSdkVersion 28
defaultConfig {
multiDexEnabled true
}
}

dependencies {
implementation ‘com.android.support:multidex:1.0.3’
}

创建新钱包

File walletFile = activity.getFileStreamPath(“wallet-protobuf”);
//创建钱包
wallet = new Wallet(Constants.NETWORK_PARAMETERS);
//创建WalletFiles,设置自动保存Wallet
WalletFiles walletFiles = wallet.autosaveToFile(walletFile, 3 * 1000, TimeUnit.MILLISECONDS, null);
//立即保存
walletFiles.saveNow();

钱包创建源码分析:

  • Wallet

  • KeyChainGroup

  • DeterministicKeyChain

  • DeterministicSeed

protected DeterministicKeyChain(DeterministicSeed seed, @Nullable KeyCrypter crypter) {
this.seed = seed;
basicKeyChain = new BasicKeyChain(crypter);
if (!seed.isEncrypted()) {
rootKey = HDKeyDerivation.createMasterPrivateKey(checkNotNull(seed.getSeedBytes()));
rootKey.setCreationTimeSeconds(seed.getCreationTimeSeconds());
addToBasicChain(rootKey);
hierarchy = new DeterministicHierarchy(rootKey);
for (int i = 1; i <= getAccountPath().size(); i++) {
addToBasicChain(hierarchy.get(getAccountPath().subList(0, i), false, true));
}
initializeHierarchyUnencrypted(rootKey);
}
// Else…
// We can’t initialize ourselves with just an encrypted seed, so we expected deserialization code to do the
// rest of the setup (loading the root key).
}

获取钱包地址

Address address = wallet.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS);
address.toString();

在获取地址的过程中会调用RIMEMD-160算法处理公钥hash:

//Utils.java
public static byte[] sha256hash160(byte[] input) {
byte[] sha256 = Sha256Hash.hash(input);
RIPEMD160Digest digest = new RIPEMD160Digest();
digest.update(sha256, 0, sha256.length);
byte[] out = new byte[20];
digest.doFinal(out, 0);
return out;
}

处理公钥hash后会进行Base58算法:

//VersionedChecksummedBytes.java
public final String toBase58() {
// A stringified buffer is:
// 1 byte version + data bytes + 4 bytes check code (a truncated hash)
byte[] addressBytes = new byte[1 + bytes.length + 4];
addressBytes[0] = (byte) version;
System.arraycopy(bytes, 0, addressBytes, 1, bytes.length);
byte[] checksum = Sha256Hash.hashTwice(addressBytes, 0, bytes.length + 1);
System.arraycopy(checksum, 0, addressBytes, bytes.length + 1, 4);
return Base58.encode(addressBytes);
}

从文件中加载钱包

//读取钱包文件
File walletFile = activity.getFileStreamPath(“wallet-protobuf”);
if (walletFile.exists()) {
InputStream inputStream = new FileInputStream(walletFile);
//反序列化
wallet = new WalletProtobufSerializer().readWallet(inputStream);
//设置自动保存
wallet.autosaveToFile(walletFile, 3 * 1000, TimeUnit.MILLISECONDS, null);
//清理钱包
wallet.cleanup();
}

创建地址二维码

String s = BitcoinURI.convertToBitcoinURI(address, null, null, null);
Bitmap bitmap = Qr.bitmap(s);
BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap);
bitmapDrawable.setFilterBitmap(false);
mQrImageView.setImageDrawable(bitmapDrawable);

public static Bitmap bitmap(final String content) {
try {
final Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.MARGIN, 0);
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
final BitMatrix result = QR_CODE_WRITER.encode(content, BarcodeFormat.QR_CODE, 0, 0, hints);

final int width = result.getWidth();
final int height = result.getHeight();
final byte[] pixels = new byte[width * height];

for (int y = 0; y < height; y++) {
final int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = (byte) (result.get(x, y) ? -1 : 0);
}
}

final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(pixels));
return bitmap;
} catch (final WriterException x) {
log.info(“problem creating qr code”, x);
return null;
}
}

Bitcoin钱包收款和转账

比特币钱包余额需要统计所有钱包地址对应的UTXO

Simplified Payment Verification (SPV):节点无需下载所有的区块数据,而只需要加载所有区块头数据(block header的大小为80B),即可验证这笔交易是否曾经被比特币网络认证过。

布隆过滤器(Bloom Filter):过滤掉那些不包含有目标地址的交易信息,这一步能避免掉大量不相关的数据下载。

创建区块链

//创建区块链文件
File blockChainFile = new File(getDir(“blockstore”, Context.MODE_PRIVATE), “blockchain”);
//创建SPVBlockStore,管理区块数据
blockStore = new SPVBlockStore(Constants.NETWORK_PARAMETERS, blockChainFile);
//加载检查点
final InputStream checkpointsInputStream = getAssets().open(“checkpoints-testnet.txt”);
CheckpointManager.checkpoint(Constants.NETWORK_PARAMETERS, checkpointsInputStream,
blockStore, earliestKeyCreationTime);
//创建区块链对象
blockChain = new BlockChain(Constants.NETWORK_PARAMETERS, wallet, blockStore);

同步区块链

//添加网络权限:

private void startup() {
Log.d(TAG, "startup: ");
peerGroup = new PeerGroup(Constants.NETWORK_PARAMETERS, blockChain);
peerGroup.setDownloadTxDependencies(0); // recursive implementation causes StackOverflowError
peerGroup.addWallet(wallet);//设置钱包,重要
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_ACTIVITIES);
peerGroup.setUserAgent(USER_AGENT, packageInfo.versionName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
peerGroup.setMaxConnections(8);
int connectTimeout = (int) (15 * DateUtils.SECOND_IN_MILLIS);
peerGroup.setConnectTimeoutMillis(connectTimeout);
int discoveryTimeout = (int) (10 * DateUtils.SECOND_IN_MILLIS);
peerGroup.addConnectedEventListener(mPeerConnectedEventListener);
peerGroup.addDisconnectedEventListener(mPeerDisconnectedEventListener);
peerGroup.addDiscoveredEventListener(mPeerDiscoveredEventListener);
peerGroup.setPeerDiscoveryTimeoutMillis(discoveryTimeout);

//添加节点探索器,重要
peerGroup.addPeerDiscovery(new PeerDiscovery() {
private final PeerDiscovery normalPeerDiscovery = MultiplexingDiscovery
.forServices(Constants.NETWORK_PARAMETERS, 0);

@Override
public InetSocketAddress[] getPeers(final long services, final long timeoutValue,
final TimeUnit timeoutUnit) throws PeerDiscoveryException {
return normalPeerDiscovery.getPeers(services, timeoutValue, timeoutUnit);
}

@Override
public void shutdown() {
normalPeerDiscovery.shutdown();
}
});
peerGroup.startAsync();
peerGroup.startBlockChainDownload(null);
}

比特币收款

获取测试用比特币:testnet.manu.backend.hamburg/faucet 刚收到的币可能需要几分钟后才能使用

//监听比特币接受事件
wallet.addCoinsReceivedEventListener(mWalletListener);
//刷新余额
Coin balance = wallet.getBalance(Wallet.BalanceType.ESTIMATED);

比特币转账

比特币测试链转账查询 创建一个Tx,对Tx进行签名,对Tx进行P2P网络广播

Address address = Address.fromBase58(Constants.NETWORK_PARAMETERS, to);
//转账金额,以mBTC为单位
Coin coin = MonetaryFormat.MBTC.parse(amount);
//创建请求
SendRequest sendRequest = SendRequest.to(address, coin);
try {
//创建Transaction
Transaction transaction = wallet.sendCoinsOffline(sendRequest);
//通过P2P广播
BlockChainService.broadcastTransaction(BitcoinWalletActivity.this, transaction);
} catch (InsufficientMoneyException e) {
Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
e.printStackTrace();
}

public static void broadcastTransaction(Context context, Transaction transaction) {
Intent intent = new Intent(ACTION_BROADCAST_TRANSACTION, null, context, BlockChainService.class);
intent.putExtra(ACTION_BROADCAST_TRANSACTION_HASH, transaction.getHash().getBytes());
context.startService(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: ");
if (intent != null) {
byte[] txHash = intent.getByteArrayExtra(“tx”);
if (txHash != null) {
Sha256Hash sha256Hash = Sha256Hash.wrap(txHash);
Transaction transaction = BitcoinWalletManager.getInstance().getWallet().getTransaction(sha256Hash);
peerGroup.broadcastTransaction(transaction);
Log.d(TAG, "onStartCommand: " + sha256Hash.toString());
}
}
return super.onStartCommand(intent, flags, startId);
}

以太坊钱包

github.com/ethereumboo…

以太坊钱包功能与比特币钱包功能类似,获取用户余额,管理地址和密钥,转账、智能合约调用。以太坊钱包一般不用在本地维护区块链数据,只需要使用JSON-RPC访问

钱包文件

KeyStore = 私钥 + 密码

如果使用ImToken创建钱包,创建了助记词,密码用来加密钱包地址对应的子私钥,加密的结果就是Keystore.

{
“address”: “001d3f1ef827552ae1114027bd3ecf1f086ba0f9”,
“crypto”: {
“cipher”: “aes-128-ctr”,
“ciphertext”: “233a9f4d236ed0c13394b504b6da5df02587c8bf1ad8946f6f2b58f055507ece”,
“cipherparams”: {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android
区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android
区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android
区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人,若有关Android学习进阶可以与我在Android终极开发交流群一起讨论交流。 点击这里前往我的Git领取资料 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android

  • Android进阶高级工程师学习全套手册

区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android

  • 对标Android阿里P7,年薪50w+学习视频

区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android

  • 大厂内部Android高频面试题,以及面试经历

分享给有需要的人,若有关Android学习进阶可以与我在Android终极开发交流群一起讨论交流。 点击这里前往我的Git领取资料 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

[外链图片转存中…(img-HtDCct7g-1710901256682)]

  • Android进阶高级工程师学习全套手册

[外链图片转存中…(img-b11dcjod-1710901256682)]

  • 对标Android阿里P7,年薪50w+学习视频

[外链图片转存中…(img-ByPqlhfB-1710901256682)]

  • 大厂内部Android高频面试题,以及面试经历

区块链钱包开发(Android篇),深入解析android核心组件和应用框架,程序员学习,区块链,android文章来源地址https://www.toymoban.com/news/detail-842925.html

到了这里,关于区块链钱包开发(Android篇),深入解析android核心组件和应用框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链钱包-android篇

    ​ 1:使用Protocol Buffers  首先根目录gradle中添加依赖: classpath \\\"com.google.protobuf:protobuf-gradle-plugin:0.8.3\\\" 然后项目文件中添加plugin,添加依赖包: apply plugin: \\\'com.google.protobuf\\\' protobuf { protoc { artifact = \\\'com.google.protobuf:protoc:3.6.1\\\' } plugins { javalite { artifact = \\\"com.google.protobuf:protoc-gen-jav

    2024年03月09日
    浏览(43)
  • 【Android R】车载 Android 核心服务 - CarService 解析

    在之前的文章从应用工程师的角度再谈车载 Android 系统中提到了\\\" CarService 是车载Android系统的核心服务之一,所有应用都需要通过 CarService 来查询、控制整车的状态\\\",不仅仅是车辆控制,实际上 CarService 几乎就是整个车载Framework最核心的组件,这也让 CarService 成了各种bug的重

    2023年04月19日
    浏览(32)
  • 微服务全栈:深入核心组件与开发技巧

    微服务,简单来说,是一种设计方法,其中一个应用程序是作为一组小的、自治的服务组织的,它们可以独立运行,并通常围绕业务功能构建。这些服务独立于彼此运行,并通过明确定义的API进行通信。与单体应用相比,微服务架构提供了更大的灵活性和可扩展性,允许团队

    2024年02月07日
    浏览(29)
  • Android资深工程书之LiveData核心组件原理剖析

    LiveData是Android架构组件库中的一个类,用于在应用程序组件之间共享数据。它是一种可观察的数据持有者,可以感知应用程序组件的生命周期,并在数据发生变化时通知观察者。 在Android应用程序中使用LiveData,你可以按照以下步骤进行: 创建LiveData实例: 在ViewModel类中创建

    2024年02月12日
    浏览(28)
  • 深入解析Safe多签钱包智能合约:模块

    读者可以在前往我的博客获得更好的阅读体验。 在上一篇博客中,我们已经讨论了 safe 合约的代理部署和核心的 GnosisSafe 合约。在此博客内,我们主要讨论在上一篇文章内没有介绍的 safe 合约内各个模块的概念和代码。我们会按照各模块在 GnosisSafe 合约内出现的顺序进行解释

    2023年04月10日
    浏览(32)
  • Android MVI架构的深入解析与对比

    M:model,此处的model并不是传统的数据模块,它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。 V:view,视图模块 I:intent,此处的intent并非是我们页面跳转的intent,而是取起实际意思:意图、目的。用来响应用户

    2024年02月05日
    浏览(30)
  • Android核心开发之——OpenGL

    OpenGL是一种用于编程计算机图形的应用程序编程接口(API)。它提供了一系列函数和方法,用于绘制2D和3D图形,以及进行渲染和图形处理。OpenGL可以跨平台使用,支持各种操作系统和硬件设备。它被广泛应用于游戏开发、虚拟现实、科学可视化、计算机辅助设计等领域。Op

    2024年02月13日
    浏览(28)
  • 深入解析Android AIDL:实现跨进程通信的利器

    Android Interface Definition Language (AIDL) 是一种Android系统中的跨进程通信机制。AIDL允许一个应用程序的组件与另一个应用程序的组件通信,并在两者之间传输数据。 AIDL的主要作用是帮助不同进程间共享数据和服务,让他们能够互相调用。例如,在开发一个多功能的音乐播放器时,

    2024年02月19日
    浏览(31)
  • DataBinding在Android应用中的深入解析与实战

    本文深入讲解了DataBinding在安卓应用中的作用、设置步骤、数据绑定表达式、双向绑定等关键功能,并通过实战例子展示了如何在Android项目中实现文本绑定、点击事件处理等常见场景。

    2024年02月16日
    浏览(26)
  • 区块链钱包软件开发python

    开发区块链钱包需要涉及到很多方面,包括前端、后端和加密算法等。以下是一个简单的示例代码,展示了如何使用Python开发一个简单的区块链钱包。 ```python import hashlib import binascii import random class Block:     def __init__(self, index, timestamp, data, previous_hash):         self.index = ind

    2024年03月24日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包