Web3js

高級呼叫智能合約函式並在 BACK-END 中送出交易

  • December 13, 2020

我已經閱讀了一些通過後端伺服器創建乙太坊交易的參考資料,所有這些都是低級別的,例如,要求我自己控制隨機數。是否有安全的方法來避免這種控制,預設情況下假設每個呼叫都可以將隨機數增加一併且沒有並行性?哪些庫允許我以更高級的方式進行控制和工作?

根據乙太坊黃皮書

nonce:一個標量值,等於發送方發送的交易數量;正式的T n**。

在這種情況下,我過去所做的是首先請求獲取交易數量,然後將此值 + 1 作為下一筆交易的隨機數。

這是一個使用web3data.js的範例

現在,如果您從客戶端收到此錯誤-32000: Nonce too low,那麼您知道另一筆交易已經完成,您必須重新送出您的交易。

讓我知道這是否有幫助。

除非您在本地儲存最新的已知 nonce,並使用鎖保護對該值的訪問,否則您無法確定。

原因是多個執行緒可以同時獲取該地址的目前交易數量(換句話說,nonce),並且它們最終都會以相同的 nonce 廣播不同的交易。

假設您有一個處理私有變數的函式n。您必須增加它的值並返回它。例如,在 Java 中這就足夠了:

public class TransactionCount {
   private long n;

   public TransactionCount(long n) {
       this.n = n;
   }

   public synchronized long next() {
       this.n += 1L;
       return this.n;
   }
}

請注意synchronized保證只有一次執行緒可以在給定時間點訪問的關鍵字,而如果其他人嘗試,他們將不得不等待,因此獲得不同的n.

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