開發前的准備
一路開發過來,積累了一些錢包的開發利器和網站,與大家分享一下。這些東西在這行開發過的人都知道,只是給行外打算入行的人做個參考。
-
最好用的ETH錢包--MetaMask
簡介:這是一款以太坊瀏覽器插件,他可以很方便的查看或操作以太坊、erc20代幣余額,也方便配合remix之類的合約IDE來部署合約,支持自定義代幣,支持多種測試網絡和正式網絡以及自定義網絡節點。總而言之,這是一款十分便利好用的錢包。
-
最官方的區塊鏈瀏覽器--etherscan
網址:以太坊官方區塊鏈瀏覽器
簡介:這是以太坊最最最官方的區塊鏈瀏覽器了,對於開發者而言,它不僅僅只是查詢區塊交易那么簡單,他還有更多有利於程序員開發的功能。它提供了眾多api和小工具,它是所有測試網絡的父域名,可以輕松地切換查看到所有測試網絡的區塊和交易,在部署合約時,它又協助你發布合約,因此對於開發者而言,這是一個不可缺少的網站。
-
獲取測試幣的網站--rinkeby、ropsten
簡介:以太坊有很多共享的測試網絡,這篇博文介紹了各個網絡的區別和其區塊鏈瀏覽器,其中開發者主要使用的區塊鏈瀏覽器不外乎rinkeby和ropsten,上述兩個網址則是這兩種測試幣的水龍頭網站,獲取測試幣的教程如下:獲取rinkeby測試幣、獲取ropsten測試幣。
-
免費的第三方節點接入--王站
網址:infura
簡介:對於ETH錢包開發而言,這是個不可或缺的網站,當然,可能也有其他第三方節點免費對用戶開放,不過我一直用的是這個網站。這個網站的作用是,我們不用搭建ETH節點也可以正常地進行ETH的開發,我們只需要動動手指注冊一個賬戶,創建我們的項目,就能拿到一個免費接入的ETH節點,而且他還包括了所有流行的測試網絡。而我之所以稱之為王站,是因為它的網站圖標類似一個王字。
-
最便捷的以太坊IDE--remix
網址:remix
簡介:對於ETH錢包開發而言,合約開發和部署或許是必不可少的一部分,為什么我會這樣說?那是因為在錢包開發中,總會需要對接各種erc20的代幣,而我們雖然能夠在獲得ETH的測試幣,但是其他的代幣的測試幣我們是很難獲得的(或者說根本無法獲得),而基於erc20協議的代幣代碼是通用的,所以接入代幣錢包的時候,我們往往是考慮自己在測試網絡部署一份erc20協議的合約,並自己鑄幣,以方便進行后續的開發,而結合remix和MetaMask來部署合約,那就是幾個步驟的事情。部署合約的流程可以參考這篇教程。
ETH錢包代碼參考
真正的知識就在經驗中
生成錢包地址、公私鑰和助記詞/通過助記詞恢復錢包地址、公私鑰
-
導入依賴
<dependency>
<groupId>org.bitcoinj</groupId>
<artifactId>bitcoinj-core</artifactId>
<version>0.14.7</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.5.5</version>
</dependency> -
初始化web3j
private final static Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/你自己從infura申請的id"));
-
參考代碼
public static Map<String, Object> ethWalletGenerate(String mnemonic, String mnemonicPath, String passWord) {
try {
DeterministicSeed deterministicSeed = null;
List<String> mnemonicArray = null;
if (null == mnemonic || 0 == mnemonic.length()) {
deterministicSeed = new DeterministicSeed(new SecureRandom(), 128, "", System.currentTimeMillis() / 1000);
mnemonicArray = deterministicSeed.getMnemonicCode();// 助記詞
} else {
deterministicSeed = new DeterministicSeed(mnemonic, null, "", System.currentTimeMillis() / 1000);
}
byte[] seedBytes = deterministicSeed.getSeedBytes();// 種子
if (null == seedBytes) {
logger.error("生成錢包失敗");
return null;
}
//種子對象
DeterministicKey deterministicKey = HDKeyDerivation.createMasterPrivateKey(seedBytes);
String[] pathArray = mnemonicPath.split("/");// 助記詞路徑
for (int i = 1; i < pathArray.length; i++) {
ChildNumber childNumber;
if (pathArray[i].endsWith("'")) {
int number = Integer.parseInt(pathArray[i].substring(0, pathArray[i].length() - 1));
childNumber = new ChildNumber(number, true);
}