使用Web3j 快速實作 Oracle -I建立smart contract wrapper


本篇是在介紹,如何使用Web3j能快速開發Oracle,不用一個一個刻跟ABI互動的function
因為整個ethereum都還在發展中,相關的工具也是,所以變動很快,這邊我使用的是Web3j 2.3.1,搭配Solidity 0.4.17



不清楚Oracle的,可以參考這篇,寫得相當詳細跟清楚
簡單來說,EVM是一個封閉環境,不可跟外界接觸,不過event(可以想作是一般寫程式的log)是會被寫到鏈上的,寫到鏈上就代表是公開網路,大家都可以去讀取,再透過程式(也就是Oracle)去監聽特地的event。然後smart contract裡的function本來就是可以從外部被執行的。所以就是透過監聽event跟執行smart contract的function,進而從外界可以跟smart contract 做互動。

首先,先撰寫你自己的smart contract,下面這是我從官方copy過來的範例,然後加了兩個event,完整的smart contract可以看這裡

pragma solidity ^0.4.17; contract Ballot { event EventVote(uint id, address voter, uint time); event EventNewVoter(address voter); function giveRightToVote(address voter) { require((msg.sender == chairperson) && !voters[voter].voted && (voters[voter].weight == 0)); voters[voter].weight = 1; EventNewVoter(voter); } function vote(uint proposal) { Voter storage sender = voters[msg.sender]; require(!sender.voted); sender.voted = true; sender.vote = proposal; EventVote(proposal, msg.sender, now); proposals[proposal].voteCount += sender.weight; } }

撰寫完smart contract後,就是進行編譯
$ solc <your smart contract>.sol --bin --abi --overwrite --optimize -o <folder name>
(solc是solidity的工具,可以compile你的程式,安裝可以參考。)
<folder name>是編譯完後的.abi跟.bin放的位置


接下來,使用到Web3j 官方的command line tool,來自動生成smart contract wrapper
$ web3j solidity generate .bin <folder name>/<smart contract>.abi -o java .bin <folder name>/<smart contract>.abi -o java -p contract
(安裝可以參考這裡,詳細參數的使用可以參考這裡。)

這樣,就生成了一個java的class,可以直接對smart contract的function作操作。至於怎麼使用生出來的類別,就下回再介紹。

留言

這個網誌中的熱門文章

What's New in Ethereum Serenity (2.0)

瑞士滑雪分享2 - 策馬特

動手實做零知識 - circom