使用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跟TransactionManager
  public 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系列大概就這樣,有誤或是有其他想法,歡迎交流

留言

這個網誌中的熱門文章

What's New in Ethereum Serenity (2.0)

瑞士滑雪分享2 - 策馬特

動手實做零知識 - circom