Web3js
高級呼叫智能合約函式並在 BACK-END 中送出交易
我已經閱讀了一些通過後端伺服器創建乙太坊交易的參考資料,所有這些都是低級別的,例如,要求我自己控制隨機數。是否有安全的方法來避免這種控制,預設情況下假設每個呼叫都可以將隨機數增加一併且沒有並行性?哪些庫允許我以更高級的方式進行控制和工作?
根據乙太坊黃皮書:
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
.