Мне удалось получить подключенного провайдера web3 с помощью eth-lightwallet, создающего контракт на частном узле geth. Я вижу транзакцию в журналах geth и вижу, как она добавляется в блок при майнинге.
Однако я не получаю контракт. адрес возвращается в обратном вызове. Я получаю хэш транзакции. Моя интуиция подсказывает мне, что внизу происходят два шага: хэш tx предоставляется в ответе JSON RPC внизу, но соответствующий eth_getTransactionReceipt не выполняется или не обрабатывается перед возвратом к обратному вызову.
Помощь приветствуется.
var ethClient = "http://localhost:1234";
var web3 = new Web3();
var global_keystore;
// setting up a web3 provider but using a keystore to get access to account information
function setWeb3Provider(keystore) {
var web3Provider = new HookedWeb3Provider({
host: ethClient,
transaction_signer: keystore
});
web3.setProvider(web3Provider);
}
// .....
var password = prompt('Enter Password to encrypt your seed', 'Password');
var providedSeed = document.getElementById('seed').value;
lightwallet.keystore.deriveKeyFromPassword(password, function (err, pwDerivedKey) {
global_keystore = new lightwallet.keystore(
providedSeed,
pwDerivedKey);
global_keystore.generateNewAddress(pwDerivedKey, 2);
setWeb3Provider(global_keystore);
// .... important bit....
var contract = web3.eth.contract(_contractABI);
var myContract = contract.new(
{
from: _ethWalletAddress,
data: _contractCode,
gas: 3000000,
gasPrice: 18000000010
}, function(e, contract){
console.log("error object: " + e );
console.log("contract object: " + contract);
if (typeof contract != 'undefined') {
console.log('address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
});
}
});
Пример логов из частной сети geth:
I0424 13:28:13.816421 eth/api.go:1177] Tx(3645d30afa7923cca42359dc2d1e46084f0da11f0b5476111a1e2ac7a82eb56f) created: 0746c6c2fde77b607e83e2bb6c25f919817e8459
I0424 13:28:23.028763 miner/miner.go:119] Starting mining operation (CPU=8 TOT=9)
I0424 13:28:23.036100 miner/worker.go:565] commit new work on block 4446 with 1 txs & 1 uncles. Took 7.286103ms
и результат ручного getTransactionReceipt с JSON RPC:
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x3645d30afa7923cca42359dc2d1e46084f0da11f0b5476111a1e2ac7a82eb56f"],"id":1}'
{"jsonrpc":"2.0","id":1,"result":{"blockHash":"0x3a524c681be27a65d6058e54de35e5502d8353e85b7a5b013c86a6909eb63dd3","blockNumber":"0x115e","contractAddress":"0x0746c6c2fde77b607e83e2bb6c25f919817e8459","cumulativeGasUsed":"0x101716","from":"0xa57f54760210a39a376231bd20d5fcec4eaf75fa","gasUsed":"0x101716","logs":[],"root":"38789ca516316c1303eda94b690202875a77d66e3116f8733081197f7157f093","to":null,"transactionHash":"0x3645d30afa7923cca42359dc2d1e46084f0da11f0b5476111a1e2ac7a82eb56f","transactionIndex":"0x0"}}
пс. Я не знаю, что отчет журнала 1 дядя. Другие журналы создания контрактов не сообщали ни о каких дядях, но во всех была обнаружена одна и та же проблема с обратным вызовом.
Идиома кода действительно работает. Должно быть, это было замешательство с моей стороны, когда я учился, потому что внезапно это начало работать.
Новая функция контракта в API web3 делает два вызова обратного вызова в приведенном выше коде. Вот фрагмент кода из web3.js.
if (callback) {
// wait for the contract address adn check if the code was deployed
this.eth.sendTransaction(options, function (err, hash) {
if (err) {
callback(err);
} else {
// add the transaction hash
contract.transactionHash = hash;
// call callback for the first time
callback(null, contract);
checkForContractAddress(contract, callback);
}
});
} else {
var hash = this.eth.sendTransaction(options);
// add the transaction hash
contract.transactionHash = hash;
checkForContractAddress(contract);
}
return contract;
Этот код выполняет обратный вызов, как только он получает хэш транзакции из первого базового вызова JSON RPC. CheckForContractAddress снова вызовет обратный вызов, как только второй базовый вызов JSON RPC подтвердит, что транзакция была добыта: контракт развернут.
Я мог бы заметить проблему, если бы знал о двух вызовах обратного вызова и регистрировал для каждого что-то свое.
Пример документации web3 ПРОВЕРЯЕТ, что адрес контракта определен перед ведением журнала. Это предотвратило бы путаницу. Я изменил его на тестовый «контракт». Моя вина.
если (тип контракта.адрес != 'undefined') {}
пользователь375
межевание
межевание
межевание
пользователь375
межевание
межевание