第6章 建立智慧型合約部署平台

2021-09-16 19:30:41 字數 1580 閱讀 6904

在本章中,我們將講解以下內容:

·計算交易nonce。

·使用交易池json-rpc api。

·為合約建立和方法呼叫生成交易資料。

·估算交易所需的gas。

·發現賬戶的當前可用餘額。

·使用solcjs編譯智慧型合約。

·開發乙個編寫、編譯和部署智慧型合約的平台。

6.1 計算乙個位址的交易nonce

對於用geth維護的賬戶,不需要擔心nonce計數,因為geth可以向交易新增正確的nonce並簽名。如果賬戶不是用geth管理的,則需要自行計算nonce。

為了自行計算nonce,可以使用geth提供的gettransactioncount方法。第乙個實參應當是所需 的交易數的位址,第二個實參是需要交易數的那個區塊。我們可以用「pending(待定)」字串作為區塊,這個區塊包括從當前挖出的區塊的交易。正如此 前的章節所述,geth維護乙個待定交易和排隊交易的交易池。為了挖出乙個區塊,geth把待定交易從交易池中取出,並開始挖新的區塊。在沒有挖該區塊之 前,待定交易一直在交易池中,一旦挖出來,該交易就從交易池中刪除。在挖區塊過程中接收到的新incoming交易被放入交易池,在下乙個區塊中被挖。所 以當呼叫gettransactioncount並把「pending」作為第二個實參時,它不會看交易池裡面;相反,它就認為該交易在待定區塊裡。

所以,如果想從不被geth管理的賬戶傳送交易,就要計算區塊鏈中賬戶交易的總數,並和交易池中的待定交易相加。如果想使用來自待定區塊的待定交易,則不能得到正確的nonce,因為交易被傳送給geth的間隔可能只有幾秒,而平均需要12秒才能在區塊鏈中確認交易。

在前一章中,我們用hooked-web3-provider向交易中新增nonce。不幸的是,hooked- web3-provider嘗試得到nounce的方法並不正確。它為每個賬戶維護乙個計數器,每次從該賬戶傳送交易就增加計數。但如果交易是非法的(例 如,如果交易嘗試傳送比賬戶內更多的以太幣),它並不能減少計數。因此直到hooked-web3-provider被重置(即客戶端被重置),該賬戶的 其他交易都在排隊且不會被挖。如果建立多個hooked-web3-provider例項,則這些例項不能彼此同步賬戶的nonce,所以最終的 nonce結果可能是錯的。但是在向交易新增nonce之前,hooked-web3-provider得到的總是到待定區塊的交易計數器,並使用與計數 器相比較大的那乙個。所以如果來自於hooked-web3-provider管理的乙個賬戶的交易是網路中的另乙個節點傳送的,並被待定區塊接納,則 hooked-web3-provider能看到它。但是不能依賴整個hooked-web3-provider計算nonce。這對於客戶端應用原型機 製造很有益處,並適合在如果沒有向網路廣播交易且hooked-web3-provider經常重置使用者,就可以看到和重新傳送交易的應用中使用。例如, 在錢包服務中,使用者將頻繁地上載頁面,所以經常建立新的hooked-web3-provider例項。如果交易沒有被廣播、不合法或者沒有被挖出,那麼 使用者可以更新頁面並重新傳送交易。

'); (window.slotbydup = window.slotbydup || ).push(); })();

'); (window.slotbydup = window.slotbydup || ).push(); })();

Truffle開發框架建立智慧型合約

2.安裝truffle npm install g truffle 3.安裝testrpc testrpc自帶10個使用者賬戶主要用於truffle除錯 npm install g ethereumjs testrpc 4.接下來我們就可以建立專案了 truffle init webpack 由於新...

第 6章 函式

6.1.2引數 2.引數陣列 c 允許為函式指定乙個 只能乙個 特殊的引數,這個引數必須是函式定義中的最後乙個引數,可用params關鍵字定義他們 如 params int vals 3.引用引數和值引數 理解 將本來在函式中引數按值引用的規則改變成按傳遞引用,使得這個引數會改變,定義引數和傳遞引數...

第6章 函式

1.自動物件 只存在於塊執行期間的物件 2.區域性靜態物件static 在程式執行路徑第一次經過物件定義語句時初始化,並且知道程式終止才被銷毀,如果區域性靜態變數沒有顯示的初始值,初始化為0.3.如果函式無須改變引用形參的值,最好將其生命為常量引用。4.使用引用形參返回額外資訊 5.和其他初始化過程...