日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用web3j构建以太坊钱包

發(fā)布時(shí)間:2023/11/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用web3j构建以太坊钱包 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

創(chuàng)建一個(gè)以太坊錢包有多種方式,一般情況下可以通過geth、EtherumWallet等客戶端。對(duì)于前端,可以使用插件MetaMask進(jìn)行創(chuàng)建。這幾種方式技術(shù)實(shí)現(xiàn)雖然不同,但底層原理是一致的。本文主要介紹如何通過web3j架構(gòu)創(chuàng)建一個(gè)以太坊的冷錢包,從而實(shí)現(xiàn)將這一過程部署在服務(wù)端或者android端。

文中涉及到的技術(shù)棧有:

Web3j :輕量級(jí)java庫(kù),用于連接以太坊客戶端或節(jié)點(diǎn)

Infura :以太坊基礎(chǔ)設(shè)施,用于訪問以太坊主網(wǎng)絡(luò)或測(cè)試網(wǎng)絡(luò)

Java:編程語(yǔ)言

1.Web3j的安裝

無論是java工程還是android工程,web3j都提供了maven和grade 兩種依賴方式:

  • java工程
    • manen依賴
    <dependency><groupId>org.web3j</groupId><artifactId>core</artifactId><version>3.3.1</version> </dependency> 復(fù)制代碼
    • gradle依賴
    compile ('org.web3j:core:3.3.1') 復(fù)制代碼
  • android工程
    • maven依賴
    <dependency><groupId>org.web3j</groupId><artifactId>core</artifactId><version>3.3.1-android</version> </dependency> 復(fù)制代碼
    • gradle依賴
    compile ('org.web3j:core:3.3.1-android') 復(fù)制代碼

    值得注意的是,目前的web3j對(duì)于高版本JDK存在不兼容的問題,如果出現(xiàn)如下類似的問題,直接更換JDK為version 8即可。

    Could not determine Java version using executable /Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/bin/java.

    2.關(guān)于Infura

    以太坊的客戶端實(shí)現(xiàn)有多種,但很多都需要在本地同步所有的節(jié)點(diǎn)數(shù)據(jù)而占用大量硬盤存儲(chǔ)空間,并且需要消耗同步的時(shí)間。Infura就是提供一種中心化的服務(wù),通過web3.js或者web3j使前端或服務(wù)端能便捷的訪問以太坊所有節(jié)點(diǎn)。可以理解為一種以太坊客戶端的云端版本。使用過程需要注冊(cè),一個(gè)專屬的訪問token。本文中使用的客戶端都是Infura提供的Rinkeby測(cè)試網(wǎng)絡(luò)。

    3.新建錢包文件keyfile

    在以太坊中,錢包(wallet)和賬戶(account)是兩個(gè)不同的概念。賬戶是以太坊的核心,由一對(duì)秘鑰組成-公鑰和私鑰。賬戶可以分為兩種,外部賬戶和合約賬戶。而錢包是指保存 地址、公鑰、私鑰的文件或其他機(jī)構(gòu),每個(gè)錢包文件至少包含一個(gè)賬戶。創(chuàng)建錢包的同時(shí)也是創(chuàng)建一個(gè)以太坊賬戶的過程不同的客戶端創(chuàng)建錢包的方式不一致但原理相同,有關(guān)錢包是具體是如何生成的可以查看另外這篇文章。

  • 新建一個(gè)java工程,初始化gradle或者maven
  • 依賴web3j
  • 新建Application.java文件,設(shè)置程序入口main函數(shù)
  • 調(diào)用錢包工具類生成錢包文件
  • /*************創(chuàng)建一個(gè)錢包文件**************/ private void creatAccount() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, CipherException, IOException {String walletFileName0="";//文件名String walletFilePath0="/Users/yepeng/MyGitHub/z_wallet_temp";//錢包文件保持路徑,請(qǐng)?zhí)鎿Q位自己的某文件夾路徑walletFileName0 = WalletUtils.generateNewWalletFile("123456", new File(walletFilePath0), false);//WalletUtils.generateFullNewWalletFile("password1",new File(walleFilePath1));//WalletUtils.generateLightNewWalletFile("password2",new File(walleFilePath2));log.info("walletName: "+walletFileName0); } 復(fù)制代碼

    錢包構(gòu)建的過程中需要輸入的三個(gè)參數(shù),分別設(shè)置錢包的密碼、保存路徑、以及是否輕量級(jí)錢包。

    執(zhí)行創(chuàng)建函數(shù)后,會(huì)自動(dòng)在指定路徑生成一個(gè)json 文件,即錢包keyfiles。

    錢包文件結(jié)構(gòu):

    • cipher:加密算法,AES算法,用于加密以太坊私鑰
    • cipherparams:cipher算法需要的參數(shù),參數(shù)iv,是aes-128-ctr加密算法需要的初始化向量
    • ciphertext:加密后的密文,aes-128-ctr函數(shù)的加密輸入密文;
    • kdf:秘鑰生成函數(shù),用于使用密碼加密keystore文件
    • kdfparams:kdf算法所需要的參數(shù)
    • mac:驗(yàn)證密碼的編碼

    生成錢包的逆向過程 為加載錢包。

    4.加載錢包文件

    加載錢包的過程需要提供錢包文件和密碼

    /********加載錢包文件**********/ private void loadWallet() throws IOException, CipherException {String walleFilePath="/Users/yepeng/MyGitHub/z_wallet_temp/UTC--2018-04-10T02-51-24.815000000Z--12571f46ec3f81f7ebe79112be5883194d683787.json";String passWord="123456";credentials = WalletUtils.loadCredentials(passWord, walleFilePath);String address = credentials.getAddress();BigInteger publicKey = credentials.getEcKeyPair().getPublicKey();BigInteger privateKey = credentials.getEcKeyPair().getPrivateKey();log.info("address="+address);log.info("public key="+publicKey);log.info("private key="+privateKey);} 復(fù)制代碼

    函數(shù)運(yùn)行的結(jié)果:

    通過工具類 WalletUtols的函數(shù) loadCredentials(),會(huì)返回一個(gè)對(duì)象Credentials,這個(gè)對(duì)象即包含了錢包文件的所有信息,包括地址、秘鑰對(duì)。

    至此,錢包的創(chuàng)建和加載已經(jīng)完成,但這一過程全部發(fā)生在本地,并未同步到以太坊區(qū)塊鏈。查詢地址余額前,需要連接以太坊結(jié)點(diǎn)。

    5.構(gòu)建Web3j實(shí)體,連接以太坊結(jié)點(diǎn)

    web3j是連接java端與以太坊的橋梁,廣播交易,查詢賬戶都需要通過web3j實(shí)體。web3j支持通過http進(jìn)行構(gòu)建,而且兼容了infura。在本文中,使用的是infura的測(cè)試網(wǎng)絡(luò)Rinkeby。

    /*******連接以太坊客戶端**************/ private void conectETHclient() throws IOException {//連接方式1:使用infura 提供的客戶端web3j = Web3j.build(new HttpService("https://rinkeby.infura.io/zmd7VgRt9go0x6qlJ2Mk"));// TODO: 2018/4/10 token更改為自己的//連接方式2:使用本地客戶端//web3j = Web3j.build(new HttpService("127.0.0.1:7545"));//測(cè)試是否連接成功String web3ClientVersion = web3j.web3ClientVersion().send().getWeb3ClientVersion();log.info("version=" + web3ClientVersion); } 復(fù)制代碼

    web3j實(shí)體構(gòu)建完成后,可以打印出版本號(hào)以測(cè)試是否連接成功。如果成功,就可以做其他的事情了。值得注意的是,web3j采用的是RxJava的設(shè)計(jì),所以許多函數(shù)的返回值是 Request,這個(gè)對(duì)象有兩種執(zhí)行方式,異步和同步,即send()和sendAsyn()。

    6.查詢賬戶余額

    查詢賬戶的余額的方式:

    /***********查詢指定地址的余額***********/ private void getBlanceOf() throws IOException {if (web3j == null) return;String address = "0x41F1dcbC0794BAD5e94c6881E7c04e4F98908a87";//等待查詢余額的地址//第二個(gè)參數(shù):區(qū)塊的參數(shù),建議選最新區(qū)塊EthGetBalance balance = web3j.ethGetBalance(address, DefaultBlockParameter.valueOf("latest")).send();//格式轉(zhuǎn)化 wei-etherString blanceETH = Convert.fromWei(balance.getBalance().toString(), Convert.Unit.ETHER).toPlainString().concat(" ether");log.info(blanceETH); } 復(fù)制代碼

    其中核心方法 web3j.ethGetBalance(address, defaultBlockParameter) 中的第二個(gè)參數(shù)比較特殊,指默認(rèn)的區(qū)塊參數(shù)。當(dāng)請(qǐng)求余額的方法作用與以太坊的區(qū)塊網(wǎng)絡(luò)時(shí),這個(gè)參數(shù)決定了查詢區(qū)塊的高度。

    • HEX String - 一個(gè)整數(shù)塊號(hào)
    • String "earliest" 為最早/起源塊
    • String "latest" - 為最新的采礦塊
    • String "pending" - 待處理狀態(tài)/交易

    一般情況下,選擇“l(fā)atest”即可。

    以太坊中,如果沒有特殊標(biāo)示,數(shù)字的單位都是小數(shù)點(diǎn)后18位,因此查詢賬戶余額有必要將wei轉(zhuǎn)化成ether

    6.使用錢包進(jìn)行轉(zhuǎn)賬

    作為一個(gè)錢包,除了保存賬戶資產(chǎn)外,最重要的就是轉(zhuǎn)賬或交易了,利用web3j可以便捷的實(shí)現(xiàn)eth的轉(zhuǎn)移。

    / /****************交易*****************/private void transto() throws Exception {if (web3j == null) return;if (credentials == null) return;//開始發(fā)送0.01 =eth到指定地址String address_to = "0x41F1dcbC0794BAD5e94c6881E7c04e4F98908a87";TransactionReceipt send = Transfer.sendFunds(web3j, credentials, address_to, BigDecimal.ONE, Convert.Unit.FINNEY).send();log.info("Transaction complete:");log.info("trans hash=" + send.getTransactionHash());log.info("from :" + send.getFrom());log.info("to:" + send.getTo());log.info("gas used=" + send.getGasUsed());log.info("status: " + send.getStatus());} 復(fù)制代碼

    核心方法需要提供4個(gè)參數(shù):

    • web3j實(shí)體
    • Credentials 源賬戶
    • address 轉(zhuǎn)出地址
    • value 數(shù)量
    • uint 單位

    等待片刻后,會(huì)返回轉(zhuǎn)賬結(jié)果

    可以看到交易hash、轉(zhuǎn)入轉(zhuǎn)出地址、gas消耗等信息。同時(shí)可以在etherscan-rinkeby上進(jìn)行查看本次交易詳情

    7.總結(jié)

    上面的代碼已經(jīng)完成了一個(gè)以太坊錢包所需的所有基本功能,包括創(chuàng)建、加載、轉(zhuǎn)賬、查詢。本文中采用的網(wǎng)絡(luò)是infura提供的Rinkeby測(cè)試網(wǎng)絡(luò),創(chuàng)建的錢包地址為 0x12571F46Ec3f81F7EbE79112Be5883194d683787。

    在具體的業(yè)務(wù)場(chǎng)景中,只要將測(cè)試網(wǎng)絡(luò)更換為以太坊主網(wǎng)絡(luò)即可。

    源碼地址 github.com/initsysctrl…

    轉(zhuǎn)載于:https://juejin.im/post/5ba9a007f265da0a8b572530

    總結(jié)

    以上是生活随笔為你收集整理的使用web3j构建以太坊钱包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。