看板DigiCurrency
大家好,我最近在研究私有鏈的部份,
並且用ethereum wallet發佈了一個智能合約在上面,
該智能合約很簡單,只是一個map形式的結構(key,value),
一個方法是新增,一個方法是查詢,
目前使用web3j的方式來呼叫,
但我發現短時間內大量使用web3j sendAsync()呼叫該智能合約做新增的動作,
會漏掉中間某些數據沒有成功上去,
但若使用send(),會需要10幾秒的時間才結束,太慢了,
在網路上找了很久,發現可能和nonce有關係?
不知道有誰有類似經驗的,可以回答我該怎麼做嗎?謝謝
----------------------------------------------------------------
智能合約:
contract dataStore {
struct DataStruct {
string key;
string value;
}
mapping (string => DataStruct) datas;
function newData(string key, string value) public {
datas[key] = DataStruct(key, value);
}
function getValue(string key) public view returns (string value) {
DataStruct storage c = datas[key];
return c.value;
}
}
web3j程式:
String url = "
http://localhost:8545";
Web3j web3j = Web3j.build(new HttpService(url));
Credentials credentials = null;
credentials = WalletUtils.loadCredentials("xxx", account);
DataStore contract = DataStore.load(address, web3j, credentials,
Contract.GAS_PRICE, Contract.GAS_LIMIT);
contract.newData("test", "testxxxxx").sendAsync();
--
※ 批踢踢實業坊(ptt.cc), 來自: 118.163.177.126※ 文章網址: https://www.ptt.cc/bbs/DigiCurrency/M.1518066787.A.DAD.html
推 ousapas: 你是用parity還是geth? 02/08 20:35
→ fugenyuzen: 我是用geth,發佈智能合約的方式是用mist發佈的。再使 02/08 21:03
→ fugenyuzen: 用tuffle將abi轉成java檔 02/08 21:03
推 bikeboy106: TX Nonce 你可以自己設定 或是讓node幫你決定 最好方 02/08 21:57
→ bikeboy106: 式你自己架一個node 自己送tx到自己的node 讓你的node 02/08 21:57
→ bikeboy106: 廣播transaction出去 02/08 21:57
推 ousapas: 你要不要把code貼出來 02/08 22:15
→ ousapas: 我的猜想是sendAsync來不及幫你遞增nonce 02/08 22:15
→ ousapas: ethereum的設計是一個帳號的交易nonce必須是遞增數列 02/08 22:15
→ ousapas: 短時間送出太多tx,可能會造成中間有重複的nonce 02/08 22:16
→ ousapas: 重複nonce的tx都會被拒絕處理 02/08 22:16
→ ousapas: 所以才會造成有些成功有些失敗的現象 02/08 22:17
推 bikeboy106: 印象中web3是不處理nonce的, 所以要嘛client side自 02/09 00:44
→ bikeboy106: 己指定 不然就是node給. 所以聽起來像是node使用的版 02/09 00:44
→ bikeboy106: 本有TX nonce 同步的問題 02/09 00:44
→ bikeboy106: 要去看node 的 log才知道發生什麼問題 02/09 00:45
→ fugenyuzen: 目前應該是找到方法解決了,我自己給nonce並且遞增就可 02/09 16:37
→ fugenyuzen: 以正常的把資料往上送,謝謝上面二位給我很大的幫助 02/09 16:37