發表文章

使用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。 TransactionMa...

使用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); ...

如何使用Objective-C 呼叫 JavaScript - Part II 實戰篇

前情提要,如果我需要require其他的套件,像下面這樣,該怎麼辦? "use strict" ;  var   version  =  require ( '../lerna.json' );  var   core   =   require ( '../packages/web3-core' );  var   Eth   =   require ( '../packages/web3-eth' );  var   Net   =   require ( '../packages/web3-net' );  var   Personal   =   require ( '../packages/web3-eth-personal' );  var   Shh   =   require ( '../packages/web3-shh' );  var   Bzz   =   require ( '../packages/web3-bzz' );  var   utils   =   require ( '../packages/web3-utils' ); 最後找到一個方法,不知道是不是唯一,也不知道是不是最好的(歡迎有經驗的人一起分享),我使用了 Browserify 。就我的認知,Browserify就是把require到的檔案,全部打包到一個檔案裡,也就是你最後會有一個幾千行的 .js檔案。 首先,先安裝npm(npm就是Node.js安裝管理工具,如何安裝npm,可以參考 這裏 ) 再來,寫一個 .js檔案,把你需要的套件require進來,然後assign給window這個物件, // index.js "use strict" let Web3 = require ( '../3rd_party/web3.js-1.0.0' ); window . Web3 = Web3 ; 切到index...

如何使用Objective-C 呼叫 JavaScript - Part I 基礎篇

之前工作需要在ios上開發Ethereum 類電子錢包的SDK,(離線狀態)做交易的打包,簽章,呼叫ABI等等之類的,Geth, ethereum.io都有部分達不到我們需求的地方,最後採用Web3.js Objective-C經驗不是很多,JavaScript根本就不會,所以在找solution的過程,吃了不少苦頭。找了不少資料,看到的都是透過這兩種方式呼叫 WebView:JavaScript是寫在html裡的,所以需要多一個html檔案 JavaScriptCore:直接呼叫 .js檔案,類似node.js的方式,比較直接 網路上的範例大概都長得像這個樣子,直接把功能寫在html裡 <html> <head> <script> function myFunction () { alert ( "Hello World!" ); } </script> </head> <body> <button onclick = " myFunction () " > Try me </button> </body> </html> Objective-C的部分大概長得像這樣, 一定要在有UI的檔案裡 // @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 先取得html檔案路徑,使用webview loads html NSBundle * thisBundle = [ NSBundle mainBundle ]; NSString * path = [ thisBundle pathForResource :@ "first" ofType :@ "html" ]; N...