API web3 не возвращает экземпляр контракта при использовании с eth-lightwallet и hookedweb3provider

Мне удалось получить подключенного веб-провайдера с eth-lightwallet, создающего контракт на частном geth-узле. Я вижу tx в журналах geth и вижу, что он добавляется в блок при добыче.

Однако я не получаю contract.address, возвращенный в обратном вызове. Я получаю хэш транзакции. Чувство моего чувства говорит мне, что внизу есть два шага: хэш-символ tx предоставляется в ответном RPC-ответ JSON, но соответствующий 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 дядя. В других журналах создания контрактов не сообщалось о каких-либо дядях, но все они имеют одинаковую проблему с обратным вызовом.

6 голосов | спросил Interition 24 PMpSun, 24 Apr 2016 13:05:43 +030005Sunday 2016, 13:05:43

1 ответ


3

Идиома кода работает. Должно быть, это была путаница с моей стороны, когда я училась, потому что внезапно она начала работать.

Новая функция в контракте в 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. Проверьте, что адрес контракта определен до ведения журнала. Это предотвратило бы путаницу. Я изменил его, чтобы проверить «контракт». Моя ошибка.

if (typeof contract.address! = 'undefined') {}

ответил Interition 25 PMpMon, 25 Apr 2016 17:14:46 +030014Monday 2016, 17:14:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132