Отправка подписанной транзакции для создания контракта

Моя цель — отправить подписанную транзакцию для создания смарт-контракта, однако я столкнулся с проблемой, которую не мог решить несколько дней:

Когда я отправляю транзакцию (в приватной цепочке), есть два разных окончания:

- 1 Web3js говорит мне, что это сработало, я вижу транзакцию в блоке. Однако при попытке связаться с контрактом у меня есть следующий вывод:

Ошибка: не удалось декодировать uint256 из ABI: 0x

Когда я пытаюсь запустить eth.getCode(contractAddress)Geth, он возвращает0x

- 2 Web3js говорит мне, что транзакция не добыта на 50 блоков (нода не успела добыть 50 блоков). Но я вижу транзакцию в блоке (в geth).

Вот код, который я использую:

web3g = result;
getContractInstance(function (error, instance) {
    if (error) {
        console.log(error);
    } else {
        let newContract = instance;
        let deploy = newContract.deploy({
            data: bytecode,
            arguments: [MY ARGS]
        }).encodeABI();
        let gas = web3g.utils.toHex(3000000);
        let gasPrice = web3g.utils.toHex(21000000000);
        let gasLimit = web3g.utils.toHex(4000000);
        let nonce;
        web3g.eth.getTransactionCount(req.body.sender_address)
            .then(function (result) {
                nonce = result;
                nonce = web3g.utils.toHex(nonce);
                let transactionObject = {
                    gas: gas,
                    gasPrice: gasPrice,
                    gasLimit: gasLimit,
                    data: deploy,
                    from: req.body.sender_address,
                    nonce: nonce
                };

                web3g.eth.accounts.signTransaction(transactionObject, req.body.private_key, function (error, signedTx) {
                    if (error) {
                        console.log(error);
                    } else {
                        console.log(signedTx);
                        web3g.eth.sendSignedTransaction(signedTx.rawTransaction)
                            .on('confirmation', function (number, receipt) {
                                if (number == 1) {
                                        // do stuff

Может ли кто-нибудь указать мне, что я делаю неправильно?

Примечание. Я могу отправить подписанную транзакцию, используя метод, описанный выше, для передачи эфира между адресами.

Изменить: оценка газа возвращает следующее: ошибка: возвращенная ошибка: требуемый газ превышает допустимое значение или всегда завершается сбоем транзакции

Ответы (1)

Я столкнулся с аналогичной проблемой при создании подписанных транзакций и в конечном итоге разработал этот пакет. https://www.npmjs.com/package/web3js-raw . Должно решить вашу проблему.

Спасибо за ваш ответ. тем не менее, использование неофициальной библиотеки для меня не вариант, так как это для профессиональных целей, и вы можете не обновлять свою библиотеку. Но не могли бы вы объяснить, в чем проблема?
Вам не нужно использовать библиотеку, потому что исходный код доступен в общедоступном репозитории git ( github.com/fidenz-chim/web3js-raw ). Есть так много движущихся частей, когда вы пытаетесь подписать транзакцию. Все, что я сделал, это просто упаковал функции web3.js для использования в sendRawTransaction. Если вы согласны поделиться контрактом, я могу развернуть его и посмотреть, что произойдет.
Я проверю, когда смогу. Вернется к вам как можно скорее!
Что ж, ваше решение кажется довольно хорошим. Постараюсь реализовать на своей стороне. Если слишком много трудностей, будет раскошелиться. Спасибо!
Использование web3js ^0.17.0 не позволяет мне подключиться к узлу: ОШИБКА ПОДКЛЮЧЕНИЯ: не удалось подключиться к узлу. Но он отлично работает с web3js ^ 1.0.0-beta.26. Sam =e в моей собственной реализации или в вашей
Я могу подтвердить, что web3js ^ 0.17.0 работает без проблем на моем конце. Работает и у меня, и у моего коллеги.
Вы запускаете его против своего собственного узла? Если да, то какая версия гета? (у меня 1.7.3)
Я тестировал infura.io, как и мой коллега.