1. 程式人生 > >Android App 如何生成以太坊錢包

Android App 如何生成以太坊錢包

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的開發。

匯智網原創翻譯,轉載請標明出處。這裡是原文