Android开发应用程序生成以太坊钱包
Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚:
1.在app/build.gradle
中集成以下依赖项:
compile ('org.web3j:core-android:2.2.1')
web3j核心是用于从服务器下载以太坊区块链数据的核心类库。它通常用于以太坊开发。
2.我们将设计一个Android UI示例,屏幕上将有文本编辑和按钮。在EditText中,将要求用户输入钱包的密码。然后在按钮的单击事件上,我们将开始发送密码的过程。以下是layout.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="@string/textview_password"
android:padding="10dp"/>
<Button
android:id="@+id/generate_wallet_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/textview_generate_wallet"/>
</LinearLayout>
3.我们将创建一个FileOutputStream路径,将创建的钱包文件保存在存储中,这需要读写存储权限。
4.对于Android用户Api>26,需要拥有运行时权限以执行上述步骤。
5.然后有一个名为WalletUtils
的类。在web3jcore
中。在该类中,有一个方法generateWalletNewFile(password, path)
,它将接受密码参数和钱包文件的路径。 将可以创建钱包文件。
6.web3jcore
中还有一个类凭据Credentials
,它将使用WalletUtils.loadCredentials(password,path)
方法加载文件的所有凭据。以下是用于生成钱包文件的一个类和接口:
public class EthereumGenerationPresenter implements EthereumGenerationContract.Presenter {
private final EthereumGenerationContract.View mWalletGenerationView;
private String mPassword;
public EthereumGenerationPresenter(EthereumGenerationContract.View walletGenerationView, String password) {
mWalletGenerationView = walletGenerationView;
mPassword = password;
}
@Override
public void generateWallet(final String password) {
String fileName;
try {
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
if (!path.exists()) {
path.mkdir();
}
fileName = WalletUtils.generateLightNewWalletFile(password, new File(String.valueOf(path)));
Log.e("TAG", "generateWallet: " + path+ "/" + fileName);
Credentials credentials =
WalletUtils.loadCredentials(
password,
path + "/" + fileName);
mWalletGenerationView.showGeneratedWallet(credentials.getAddress());
Log.e("TAG", "generateWallet: " + credentials.getAddress() + " " + credentials.getEcKeyPair().getPublicKey());
} catch (NoSuchAlgorithmException
| NoSuchProviderException
| InvalidAlgorithmParameterException
| IOException
| CipherException e) {
e.printStackTrace();
}
}
@Override
public void start() {
generateWallet(mPassword);
}
}
public interface EthereumGenerationContract {
interface View extends BaseView<Presenter> {
void showGeneratedWallet(String walletAddress);
}
interface Presenter extends BasePresenter {
void generateWallet(String password);
}
}
public interface BasePresenter {
void start();
}
public interface BaseView<T> {
void setPresenter(T presenter);
}
7.现在Credentials
类将保存以太坊的钱包地址以及该文件的更多信息。
8.现在可以使用下面的函数获取地址:
credentials.getAddress()->
公钥
credentials.getPublicKey()
私钥
credentials.getEcKeyPair()
9.钱包生成类Activity
如下:
public class WalletGenerationActivity extends AppCompatActivity implements EthereumGenerationContract.View {
private static final int REQUEST_PERMISSION_WRITE_STORAGE = 0;
private EthereumGenerationContract.Presenter mWalletPresenter;
private Button mGenerateWalletButton;
private String mWalletAddress;
private EditText mPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_generation);
mGenerateWalletButton = (Button) findViewById(R.id.generate_wallet_button);
mPassword = (EditText) findViewById(R.id.password);
mGenerateWalletButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int permissionCheck = ContextCompat.checkSelfPermission(WalletGenerationActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
WalletGenerationActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSION_WRITE_STORAGE);
} else {
mWalletPresenter = new EthereumGenerationPresenter(WalletGenerationActivity.this,
mPassword.getText().toString());
mWalletPresenter.generateWallet(mPassword.getText().toString());
Intent intent = new Intent(WalletGenerationActivity.this, WalletActivity.class);
intent.putExtra("WalletAddress", mWalletAddress);
startActivity(intent);
}
}
});
}
@Override
public void setPresenter(EthereumGenerationContract.Presenter presenter) {
mWalletPresenter = presenter;
}
@Override
public void showGeneratedWallet(String address) {
mWalletAddress = address;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION_WRITE_STORAGE: {
if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
finish();
} else {
mWalletPresenter.generateWallet(mPassword.getText().toString());
}
break;
}
}
}
}
10.具有textview的活动类,用于显示钱包地址。
public class WalletActivity extends AppCompatActivity {
private TextView mWalletAddress;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wallet);
mWalletAddress = (TextView) findViewById(R.id.account_address);
Bundle extras = getIntent().getExtras();
mWalletAddress.setText(extras.getString("WalletAddress"));
}
}
如果希望快速进行java以太坊开发,那请看我们精心打造的教程: java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
其他以太坊教程如下:
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
汇智网原创翻译,转载请标明出处。这里是原文

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
MQTT协议的初浅认识之推送订阅
背景 了解MQTT怎么建立连接之后,现在重点来了解MQTT怎么推送,订阅两个方面。 概念 先见一张图: 这张图是依旧借鉴HiveMQ的图,来讲述MQTT协议的推送和订阅的过程。推送和订阅,我们很容易理解。这里里面的推送客户端和订阅客户端,在上篇文章MQTT协议的初浅认识之连接建立中也都提到过,都是属于MQTT的客户端。这里面有一个比较陌生的概念是Topic,即话题这个概念。 话题 这个东西在MQTT里面很灵活,客户端订阅的对象其实也就是话题。话题主要有话题主题+正斜杠组成。如下: 话题其实就是由话题主题+正斜杆,组成的一个字符串,客户端订阅了这个话题字符串之后,就可以接收这个MQTT推送过来关于这个话题的消息。中间件也是根据话题,来分发从推送客户端推送到中间件的消息。 话题通配符 单级:+ 表示不接收间隔多个话题级别,如下图: 匹配的消息结果,如下: 多级:# 表示接收多级间隔话题,如下: 匹配消息,如下: 开头:$ 表示以什么开头的消息,这个不常用。 推送消息 MQTT客户端可以在连接到中间件后立即发布消息。MQTT中间件利用基于话题的消息进行过滤。每条消息必须包含一个话题,中间件可...
-
下一篇
Redis应用之分布式锁(set)
Redis应用之分布式锁(set) 在单机应用的场景下,我们常使用的锁主要是synchronized与Lock;但是在分布式横行的大环境下,显然仅仅这两种锁已经无法满足我们的需求; 需求:秒杀场景下,有若干服务实例,假设有2个,那么分别会有若干请求分别请求这2个服务实例。要求只能有一个请求秒杀成功,本质是秒杀方法在同一时间内只能被同一个线程执行,这就需要使用到分布式锁。 场景分布式锁 基于数据库实现 基于数据库实现分布式锁,主要使用InnoDB下的for update(如使用行级锁,需加唯一索引) 基于Zookeeper实现 在指定节点的目录下,创建一个唯一的瞬时有序节点。可以使用Curator去实现。 基于缓存实现(redis) 主要使用set(setnx用法有缺陷且过时) 详解redis的set命令 我们已知道set用于设置String类型的key/value值,如下: 127.0.0.1:6379> set name gaoyuan OK 127.0.0.1:6379> get name "gaoyuan" setnx + expire = 非原子性 在redis2....
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8