使用Web3j 快速實作 Oracle - II 使用smart contract wrapper
Part II 拖得有點久...
其實產生出wrapper後,直接看source code,就大概懂怎麼使用了,web3j 直接把smart contract的function轉成Java function。接下來會解釋的就是怎麼load contract跟怎麼subscribe events。
備註:這裡的範例是用web3j 3.1.1所產生
How to load smart contract wrapper
首先,看到load的方法有兩個,其實只有差在Credentials跟TransactionManagerpublic static Ballot load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { return new Ballot(contractAddress, web3j, credentials, gasPrice, gasLimit);} public static Ballot load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { return new Ballot(contractAddress, web3j, transactionManager, gasPrice, gasLimit);}
Credentials:
這是Web3j的基本元件,大概沒什麼好說的(被揍飛 XD),還是附一下範例,基本就是帶入一串私鑰即可
Credentials cred = Credentials.create(privatekey);如果,你的應用沒有需要快速連續送交易,或是不要求在listen event的間隔,其實這樣就可以了。但若有其中一項需求,這個方式就無法滿足,需要用TransactionManager。
TransactionManager:
Case 1 快速連續送transaction:
這個時候就需要FastRawTransactionManager這個物件,宣告如下
FastRawTransactionManager fastRawTxMgr = new FastRawTransactionManager(web3, credentials);這裡面的實作方式,就是取得nonce後,不再跟鏈上取新的值,直接做+1的動作。所以可想而知,在同一個帳號下,是不能在multi-thread使用。
Case 2 設定listen event的間隔:
需要使用RawTransactionManager這個物件,後面兩個參數分別是attemps跟sleepDuration,attemps是在內部get transaction receipt的retry次數(可以先不管),另一個就是間格多久會去get transaction receipt(也就是多久去監看events),在web3j裡預設是40次跟15秒,如果想縮短監看的間格,就是改變sleepDuration這個值,以下的範例是1秒
RawTransactionManager rawTxMgr = new RawTransactionManager(web3, credentials, 40, 1000);
那...如果我兩個都需要勒?!!! 那就混在一起做 砂....鍋魚頭(今天是嗑藥了嗎 XD)
在FastRawTransactionManager裡有另一個constructor是
public FastRawTransactionManager(Web3j web3j, Credentials credentials, TransactionReceiptProcessor transactionReceiptProcessor)
不過發現設定之後並沒有用...
後來發現在web3j 物件build有另一個版本,build出來的物件,在帶入FastRawTransactionManager,以下是範例
static Web3j build(Web3jService web3jService, long pollingInterval, ScheduledExecutorService scheduledExecutorService) Web3j.build(web3Service, 1000, Async.defaultExecutorService());以上就是如何load smart contract的Java wrapper class。接下來就是介紹如何monitor鏈上的events
How to monitor events
首先,可以在wrapper檔裡,可以看到Observable的function,如下public Observable<EventNewVoterEventResponse> eventNewVoterEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
我們就是要利用這個去註冊收到event後的callback(因為我跟Java不熟,又剛開始接觸Web3元件,雖然是簡單的註冊,當時也搞了我好一下子),最後範例如下
contract.eventNewVoterEventObservable(DefaultBlockParameterName.EARLIEST,DefaultBlockParameterName.LATEST). subscribe(new Action1<Ballot.EventNewVoterEventResponse>() { @Override public void call(Ballot.EventNewVoterEventResponse response) { }在call裡面,就可以放收到event後要處理的事情
用Web3j實作Oracle系列大概就這樣,有誤或是有其他想法,歡迎交流
留言
張貼留言