1. 程式人生 > >web3j以太坊智慧合約流程淺析

web3j以太坊智慧合約流程淺析

這次的專案,主要在智慧合約開發上。這裡簡單講講隱藏在合約下面的一些東西。solidity合約的編寫以及邏輯處理,請自行度娘。

1、web3j

web3j是一套訪問以太坊http rpc服務的java sdk。有什麼業務,主要看etherum-harmony提供的介面,而不是以太坊有什麼服務。以太坊提供的服務比較簡單,只有轉賬,存證和EVM執行。

而假如去看web3j的通訊程式碼,你可以看到,很多和合約相關的呼叫,都是通過轉賬介面完成的,在轉賬介面中附加了業務引數,然後rpc伺服器解析業務引數進行業務處理。

web3j的建立和使用有TransactionManager以及ScheduledExecutorService可以自定義,可以用來定義連線超時,nonce規則,重新整理頻率等。

2、合約部署(這裡不講solc編譯部分,自行度娘)

智慧合約在鏈上的表現形式就是一段編譯的二進位制編碼,web3j將生成的二進位制檔案,send到以太坊去儲存。

以太坊產生合約地址,並儲存二進位制資料,可供後面合約呼叫。

3、合約載入

合約載入,web3j提供了友好的java函式介面可以載入呼叫,但是內部的邏輯,是載入函式呼叫介面abi的對映。一個abi可以對應一個具體的方法+引數。

從這點我們也可以知道兩個點。一、假如合約的地址不對(對應的是二進位制程式碼不對),載入是可以成功,但是由於對映是錯誤的,所以呼叫會出現問題。二、合約的載入是本地的,依賴的是本地的程式碼或者abi檔案等,不需要去以太坊獲取。

4、合約呼叫

web3j中合約呼叫分兩步:先是將請求封裝好,用sendRawTransaction傳送到鏈上。然後用得到的transactionhash去輪詢結果transactionReceipt。

請求封裝合約載入完成,就可以按照abi的設定,進行方法呼叫。web3j這邊的處理邏輯,是將引數按照格式封裝,大致是合約地址,合約abi簽名,引數段,這樣。

以太坊接受到請求以後,解析請求引數,讀取之前儲存的合約二進位制程式碼,再讀取函式內容,從而進行一步步呼叫。比如得到命令0x**,進行轉賬, 0x**進行判斷這麼一個概念。

在合約呼叫中,其實內部會有多次的合約呼叫,轉賬等,而這些,是不會展示在外層的合約呼叫中的,block打包的交易只有最外層的那個呼叫。

PS:這裡有個坑是這樣的,假如合約執行失敗(比如合約不存在),receipt還是會產生。為什麼會這樣呢?因為合約呼叫是一次交易,和evm的執行是分開的。所以,給一個空地址或者過期合約轉賬是會成功的,這點很重要。當你把一個合約給銷燬以後,繼續呼叫合約的內容,還是會扣錢的,所以我們想的方法是,給合約一個狀態,但不去銷燬它,用狀態來做錯誤處理。或者你需要先呼叫getCode方法去檢查合約地址是否合法。

5、合約訊息

除了合約呼叫,合約的另一個領域是訊息。

web3j中的訊息,是去rpc伺服器中建立一個logfilter()。建立完成以後,起一個observer監聽,間隔一定時間,去查下filterchange的內容。

在以太坊中合約呼叫以後,會將合約的訊息,寫入logs欄位。rpc服務利用bloomfilter過濾block中的log,並將匹配的log傳送到filter中。等到有filterchange查詢來臨,就將log傳送出去。

web3j接收到新的log內容,將其轉化為java的event物件,並回調給監聽observer,由其處理event。

大概就是這些。這篇是第一篇,也可能最後一篇寫區塊鏈的文章。後續就從專案組離開了,不知道還能不能接觸了。