成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java使用web3j和spring boot構(gòu)建以太坊區(qū)塊鏈dapp

hidogs / 1676人閱讀

摘要:使用和以太坊客戶端的容器鏡像,可以快速啟動(dòng)解決方案,實(shí)現(xiàn)區(qū)塊鏈技術(shù)的本地開發(fā)。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。以太坊,主要講解如何使用開發(fā)基于的以太坊應(yīng)用,包括賬戶管理狀態(tài)與交易智能合約開發(fā)與交互過濾器和事件等。

區(qū)塊鏈最近IT世界的流行語之一。這項(xiàng)有關(guān)數(shù)字加密貨幣的技術(shù),并與比特幣一起構(gòu)成了這個(gè)熱門的流行趨勢。它是去中心化的,不可變的分塊數(shù)據(jù)結(jié)構(gòu),這是可以安全連接和使用的密碼算法。在這種結(jié)構(gòu)中的每一區(qū)塊通常包含前一個(gè)區(qū)塊的加密哈希,一個(gè)時(shí)間戳,和交易數(shù)據(jù)。區(qū)塊鏈?zhǔn)屈c(diǎn)對點(diǎn)管理網(wǎng)絡(luò)的,并在加入每一個(gè)新的塊之前進(jìn)行節(jié)點(diǎn)間通信的驗(yàn)證。這是關(guān)于區(qū)塊鏈的部分理論。簡而言之,這是一種技術(shù),它允許我們使用一個(gè)去中心化的方式管理雙方的交易?,F(xiàn)在,問題是我們?nèi)绾卧谖覀兊南到y(tǒng)中實(shí)現(xiàn)它。

于是以太坊來了。這是一個(gè)Vitarik Buterin提供的去中心化的平臺(tái),可以通過腳本語言創(chuàng)建開發(fā)應(yīng)用。它的想法是從比特幣獲得的,并由新的叫Ether即以太坊幣的加密數(shù)字幣驅(qū)動(dòng)。今天,以太幣是繼比特幣之后的第二大加密數(shù)字貨幣。以太坊技術(shù)的核心是EVM(以太坊虛擬機(jī)),它可以被視為類似于Java虛擬機(jī),而且用一種完全去中心化的節(jié)點(diǎn)網(wǎng)絡(luò)?;趈ava世界實(shí)現(xiàn)以太坊交易我們使用web3j庫。這是一個(gè)輕量級(jí)的、響應(yīng)式、類型安全的java和Android庫結(jié)合了以太坊區(qū)塊鏈節(jié)點(diǎn)。更多的細(xì)節(jié)可以在這里找到web3j.io中文版。

1.本地運(yùn)行

雖然有許多針對區(qū)塊鏈文章,但以太坊相關(guān)的網(wǎng)絡(luò)內(nèi)容中不容易找到一個(gè)解決方案描述如何準(zhǔn)備在本地機(jī)器使用實(shí)例運(yùn)行以太坊。值得一提的是,一般有兩種最基本的客戶端可以使用:Geth和Parity。原來,我們可以很容易地在本地使用Docker容器運(yùn)行節(jié)點(diǎn)。默認(rèn)情況下,連接節(jié)點(diǎn)的以太坊主網(wǎng)絡(luò)(公有鏈)?;蛘撸憧梢詫⑺B接到測試網(wǎng)絡(luò)或Rinkeby網(wǎng)絡(luò)。但開始最好的選擇就是運(yùn)行在設(shè)置了開發(fā)參數(shù)(--dev)的開發(fā)模式下,并在Docker容器中運(yùn)行命令。

下面的命令啟動(dòng)Docker容器開發(fā)模式在端口8545調(diào)用以太坊RPC API。

$ docker run -d --name ethereum -p 8545:8545 -p 30303:30303 ethereum/client-go --rpc --rpcaddr "0.0.0.0" --rpcapi="db,eth,net,web3,personal" --rpccorsdomain "*" --dev

在開發(fā)模式中運(yùn)行該容器時(shí),一個(gè)非常好的消息是,在默認(rèn)的測試帳戶上有大量的Ether。在這種情況下,你不必挖掘任何Ether,便能夠開始測試。超級(jí)棒!現(xiàn)在,讓我們創(chuàng)建一些其他的測試帳號(hào),并做一些檢查。為了實(shí)現(xiàn)這一點(diǎn),我們需要在容器內(nèi)部運(yùn)行Geth的交互式JavaScript控制臺(tái)。

$ docker exec -it ethereum geth attach ipc:/tmp/geth.ipc
2.以太坊節(jié)點(diǎn)使用JavaScript控制臺(tái)管理

運(yùn)行JavaScript控制臺(tái)可以方便顯示默認(rèn)帳戶(Coinbase),所有可用的賬戶及其余額清單。這里的屏幕顯示我的以太坊結(jié)果。

現(xiàn)在,我們必須創(chuàng)建一些測試帳號(hào)。我們可以通過調(diào)用personal.newAccount(password)函數(shù)來實(shí)現(xiàn)這一點(diǎn)。在創(chuàng)建必需的帳戶之后,我們可以使用JavaScript控制臺(tái)執(zhí)行一些測試交易,并將一些資金從基礎(chǔ)帳戶轉(zhuǎn)移到新創(chuàng)建的帳戶。下面是用于創(chuàng)建帳戶和執(zhí)行交易的命令。

3.系統(tǒng)體系結(jié)構(gòu)

我們的demo系統(tǒng)的體系結(jié)構(gòu)非常簡單。不用想復(fù)雜的事情,只是告訴大家如何發(fā)送交易到geth節(jié)點(diǎn)和接收交易收據(jù)。而transaction-service發(fā)送新交易到以太坊節(jié)點(diǎn),bonus-service節(jié)點(diǎn)監(jiān)聽傳入的交易。然后每10筆交易發(fā)送者的帳戶收到一次獎(jiǎng)金(bonus)。這里的圖表說明了一個(gè)我們的demo的系統(tǒng)架構(gòu)。

4.spring boot應(yīng)用程序使用web3j

我想現(xiàn)在我們清楚了我們到底想做什么。所以,讓我們來進(jìn)行實(shí)施。首先,我們應(yīng)該包括所有必需的依賴項(xiàng),以便能夠在Spring boot應(yīng)用程序中使用web3j庫。幸運(yùn)的是,有一個(gè)starter可以使用。


    org.web3j
    web3j-spring-boot-starter
    1.6.0

因?yàn)槲覀冊贒ocker容器運(yùn)行以太坊客戶端需要改變客戶端的自動(dòng)默認(rèn)配置的web3j的調(diào)用地址。

spring:
  application:
    name: transaction-service
server:
  port: ${PORT:8090}
web3j:
  client-address: http://192.168.99.100:8545
5.構(gòu)建應(yīng)用

如果我們將web3j starter包含到項(xiàng)目依賴項(xiàng)中,需要的是自動(dòng)裝載web3j bean。web3j負(fù)責(zé)向Geth客戶端節(jié)點(diǎn)發(fā)送交易。它用交易哈希接收響應(yīng),不管是節(jié)點(diǎn)接受或由于錯(cuò)誤被拒絕。在創(chuàng)建交易對象時(shí),重要的是將gas限制最小值設(shè)置為21000。如果發(fā)送較低的值,則可能會(huì)收到錯(cuò)誤信息:intrinsic gas too low。

@Service
public class BlockchainService {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(BlockchainService.class);
 
    @Autowired
    Web3j web3j;
 
    public BlockchainTransaction process(BlockchainTransaction trx) throws IOException {
        EthAccounts accounts = web3j.ethAccounts().send();
        EthGetTransactionCount transactionCount = web3j.ethGetTransactionCount(accounts.getAccounts().get(trx.getFromId()), DefaultBlockParameterName.LATEST).send();
        Transaction transaction = Transaction.createEtherTransaction(accounts.getAccounts().get(trx.getFromId()), transactionCount.getTransactionCount(), BigInteger.valueOf(trx.getValue()), BigInteger.valueOf(21_000), accounts.getAccounts().get(trx.getToId()),BigInteger.valueOf(trx.getValue()));
        EthSendTransaction response = web3j.ethSendTransaction(transaction).send();
        if (response.getError() != null) {
            trx.setAccepted(false);
            return trx;
        }
        trx.setAccepted(true);
        String txHash = response.getTransactionHash();
        LOGGER.info("Tx hash: {}", txHash);
        trx.setId(txHash);
        EthGetTransactionReceipt receipt = web3j.ethGetTransactionReceipt(txHash).send();
        if (receipt.getTransactionReceipt().isPresent()) {
            LOGGER.info("Tx receipt: {}", receipt.getTransactionReceipt().get().getCumulativeGasUsed().intValue());
        }
        return trx;
    }
 
}

@Service從上面的代碼看由控制器調(diào)用。POST方法的需要BlockchainTransaction對象作為參數(shù)。你可以發(fā)送發(fā)件人ID,接收人ID和交易金額。發(fā)送者和接收者ID是通過eth.account[index]可查詢的。

@RestController
public class BlockchainController {
 
    @Autowired
    BlockchainService service;
 
    @PostMapping("/transaction")
    public BlockchainTransaction execute(@RequestBody BlockchainTransaction transaction) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, CipherException, IOException {
        return service.process(transaction);
    }
 
}

你可以用下面的命令調(diào)用POST方法發(fā)送測試交易。

在發(fā)送任何交易之前,你應(yīng)該解鎖發(fā)送人帳戶。

$ curl --header "Content-Type: application/json" --request POST --data "{"fromId":2,"toId":1,"value":3}" http://localhost:8090/transaction

應(yīng)用程序bonus-service監(jiān)聽由以太坊節(jié)點(diǎn)處理的交易。它通過調(diào)用web3j.transactionObservable().subscribe(...)方法從web3j庫訂閱通知消息。它將從該地址每10個(gè)交易返回后,發(fā)送一次到發(fā)送者的帳戶。下面是bonus-service中可監(jiān)聽方法的實(shí)現(xiàn)。

@Autowired
Web3j web3j;
 
@PostConstruct
public void listen() {
    Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
        LOGGER.info("New tx: id={}, block={}, from={}, to={}, value={}", tx.getHash(), tx.getBlockHash(), tx.getFrom(), tx.getTo(), tx.getValue().intValue());
        try {
            EthCoinbase coinbase = web3j.ethCoinbase().send();
            EthGetTransactionCount transactionCount = web3j.ethGetTransactionCount(tx.getFrom(), DefaultBlockParameterName.LATEST).send();
            LOGGER.info("Tx count: {}", transactionCount.getTransactionCount().intValue());
            if (transactionCount.getTransactionCount().intValue() % 10 == 0) {
                EthGetTransactionCount tc = web3j.ethGetTransactionCount(coinbase.getAddress(), DefaultBlockParameterName.LATEST).send();
                Transaction transaction = Transaction.createEtherTransaction(coinbase.getAddress(), tc.getTransactionCount(), tx.getValue(), BigInteger.valueOf(21_000), tx.getFrom(), tx.getValue());
                web3j.ethSendTransaction(transaction).send();
            }
        } catch (IOException e) {
            LOGGER.error("Error getting transactions", e);
        }
    });
    LOGGER.info("Subscribed");
總結(jié)

區(qū)塊鏈和數(shù)字貨幣不是容易開始的話題。通過提供完整的腳本語言,以太坊簡化了使用區(qū)塊鏈進(jìn)行應(yīng)用程序開發(fā)的難度。使用web3j、spring boot和以太坊geth客戶端的docker容器鏡像,可以快速啟動(dòng)解決方案,實(shí)現(xiàn)區(qū)塊鏈技術(shù)的本地開發(fā)。

如果你想進(jìn)行本地開發(fā)時(shí)clone我的庫,可以在github上下載源代碼。

如果希望快速進(jìn)行web3j、java、以太坊開發(fā),那請看我們精心打造的教程:
web3j教程,主要是針對java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解。

其他以太坊教程如下:

以太坊教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。

以太坊開發(fā),主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。

python以太坊,主要是針對python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。

php以太坊,主要是介紹使用php進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和事件等內(nèi)容。

C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和事件等。

這里是原文

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76755.html

相關(guān)文章

  • java使用web3jspring boot構(gòu)建以太區(qū)塊dapp

    摘要:使用和以太坊客戶端的容器鏡像,可以快速啟動(dòng)解決方案,實(shí)現(xiàn)區(qū)塊鏈技術(shù)的本地開發(fā)。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。以太坊,主要講解如何使用開發(fā)基于的以太坊應(yīng)用,包括賬戶管理狀態(tài)與交易智能合約開發(fā)與交互過濾器和事件等。 區(qū)塊鏈最近IT世界的流行語之一。這項(xiàng)有關(guān)數(shù)字加密貨幣的技術(shù),并與比特幣一起構(gòu)成了這個(gè)熱門的流行趨勢。它是去中心化的,不可變的分塊數(shù)據(jù)結(jié)構(gòu),這是可以安全...

    weapon 評(píng)論0 收藏0
  • Java開發(fā)區(qū)塊的三大sdk庫

    摘要:是企業(yè)與區(qū)塊鏈相遇的地方。的框架旨在成為開發(fā)區(qū)塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 如果你想將區(qū)塊鏈合并到一個(gè)Java項(xiàng)目中,現(xiàn)在我們來看看就是這個(gè)細(xì)分領(lǐng)域中三個(gè)最大的OSS玩家。 好的伙計(jì)們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時(shí)髦的名字圍繞著我們常見的新聞,但我們作為Java開發(fā)人員知道如何輕松地與這些區(qū)塊鏈技術(shù)進(jìn)行交互嗎?以...

    iKcamp 評(píng)論0 收藏0
  • 2018以太智能合約編程語言solidity的最佳IDEs

    摘要:使用基于以太坊的智能合約的集成開發(fā)環(huán)境。以太坊教程,主要介紹智能合約與應(yīng)用開發(fā),適合入門。以太坊,主要是介紹使用進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建交易轉(zhuǎn)賬代幣開發(fā)以及過濾器和事件等內(nèi)容。 Solidity是一種以智能合約為導(dǎo)向的編程語言。這是一種只有四年的年輕語言,旨在幫助開發(fā)基于以太坊數(shù)字貨幣的智能合約。 理解它官方文檔應(yīng)該是學(xué)習(xí)Solidity的最佳來源:solidity.read...

    darkerXi 評(píng)論0 收藏0
  • 區(qū)塊開發(fā)中使用的最流行的編程語言

    摘要:我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。,一種在以太坊開發(fā)人員中流行的新的簡單編程語言,因?yàn)樗怯糜陂_發(fā)以太坊智能合約的語言。它是全球至少萬開發(fā)人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。區(qū)塊鏈技術(shù)處于初期階段,然而這種顛覆性技術(shù)已經(jīng)成功地風(fēng)靡全球,并且最近經(jīng)歷了一場與眾不同的繁榮。由于許多...

    2shou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<