Web3js

懷疑javascript函式執行

  • September 26, 2018

大家好,我有這個合約功能:

function teste(uint _oX) public returns (uint value) {
   return 34;
}

我嘗試以這種方式呼叫 JS:

MyContract.teste(1).then(value => console.log(value) );  

但我收到了這個值 34:

{blockHash:“0xd43e64033fdc8058be7da224059f15ef5f3268813294f2a9087a747d1ed674da”,blockNumber:2600,contractAddress:空,cumulativeGasUsed:21722,來自:“0xc5a5d47b525851bde4811aa870a331024156eeec”,…} blockHash:“0xd43e64033fdc8058be7da224059f15ef5f3268813294f2a9087a747d1ed674da”blockNumber:2600contractAddress:nullcumulativeGasUsed:21722events:{}從:“0xc5a5d47b525851bde4811aa870a331024156eeec”gasUsed:21722logsBloom :“0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000“狀態:”為0x1“到:”0x7b475783cee479de3b270193b61450c649b2abef“transactionHash:”0x4455026eeae746f58e49f977f42597321426f9fe6cc3818deffac63dd9c61909“transactionIndex:0__proto__:對象目的目的

有人可以幫我解決這個問題:| 保護你

乙太坊合約有兩種呼叫方法。

一種方法是以只讀方式查詢本地節點及其區塊鏈副本。這種方式將按34預期返回。

另一種方法是向網路發送交易,這可能會改變合約狀態。即使你的函式不儲存任何東西,這樣的交易仍然會循環並被探勘並出現在一個塊中,因此所有節點都可以同意沒有發生任何事情。

您正在使用第二種方法,因此您將獲取有關已發送交易、其成功、交易雜湊、塊號……除了34. 這是因為return此方法無法訪問值。

你想要的是閱讀契約。有兩種方法可以做到這一點。

您可以不理會合約,並使用該.call()方法呼叫該函式,以明確表示客戶端希望它是只讀操作,而您實際上確實想要34.

MyContract.teste.call(1).then(value => console.log(value) );

您可以將此行為烘焙到契約中,這對於不對狀態做任何事情的功能來說是一種很好的形式,即它們旨在檢查狀態。pure純粹是計算的,不需要訪問狀態,view是只讀的,但需要訪問狀態。

function teste(uint _oX) public pure returns (uint value) { return 34; } 有關此的更多資訊:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

繼續。響應將是一個看起來很奇怪的東西。這是一個“bigNumber”(單獨的主題),因為 JavaScript 無法處理來自乙太坊的 256 位整數。你可以像這樣解壓它,你應該得到34.

console.log(value.toString(10));

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/59455