web3j呼叫智能合約的問題 - 數位貨幣

Table of Contents

大家好,我最近在研究私有鏈的部份,

並且用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();

--

All Comments

Jacky avatarJacky2018-02-12
你是用parity還是geth?
Lily avatarLily2018-02-13
我是用geth,發佈智能合約的方式是用mist發佈的。再使
用tuffle將abi轉成java檔
Genevieve avatarGenevieve2018-02-17
TX Nonce 你可以自己設定 或是讓node幫你決定 最好方
式你自己架一個node 自己送tx到自己的node 讓你的node
廣播transaction出去
Poppy avatarPoppy2018-02-17
你要不要把code貼出來
我的猜想是sendAsync來不及幫你遞增nonce
ethereum的設計是一個帳號的交易nonce必須是遞增數列
Olive avatarOlive2018-02-21
短時間送出太多tx,可能會造成中間有重複的nonce
重複nonce的tx都會被拒絕處理
Blanche avatarBlanche2018-02-22
所以才會造成有些成功有些失敗的現象
Hamiltion avatarHamiltion2018-02-26
印象中web3是不處理nonce的, 所以要嘛client side自
己指定 不然就是node給. 所以聽起來像是node使用的版
本有TX nonce 同步的問題
Faithe avatarFaithe2018-02-28
要去看node 的 log才知道發生什麼問題
Edward Lewis avatarEdward Lewis2018-03-02
目前應該是找到方法解決了,我自己給nonce並且遞增就可
以正常的把資料往上送,謝謝上面二位給我很大的幫助