Как оценивать газ при создании /развертывании контракта в частном эфирум blockchain

Что я сделал
a) Когда я использую web3.eth.estimateGas для оценки стоимости конструктора создания контракта без параметров, оценка правильная.

b) Если контракт уже развернут, а затем оценивает стоимость газа по контрактной функции с параметрами, он работает нормально. (contract.myMethod.estimateGas() с помощью web3 api)

Вопрос
a) Когда я оцениваю газ в контракте на время создания контракта (contractObject.new) с параметризованным конструктором, он дает неправильную оценку стоимости газа. (web3.eth.estimateGas of web3 api)

Что я хочу
a) Когда я оцениваю газ с несколькими конструкторами параметров контракта, тогда он должен оценивать правильный газ.  (contractObject.new для вызова конструктора)

b) Взаимодействие с браузером дает правильную оценку газа контракта с параметризованным конструктором -> перед созданием /развертыванием контракта (например, стоимостью транзакции или стоимостью исполнения, как я могу использовать их алгоритм с web3 api для оценки правильного пути газа?)

17 голосов | спросил Imroz 2 Jpm1000000pmMon, 02 Jan 2017 14:03:27 +030017 2017, 14:03:27

2 ответа


14

Попробуйте использовать .getData().

.getData() возвращает закодированные параметры функции, чтобы отправить транзакцию вручную. Затем вы можете вставить это в web3.eth.estimateGas() (тот, что находится на web3.eth, а не на данный метод.), Чтобы имитировать отправку транзакции.

Вот непроверенный пример, но, надеюсь, он может помочь вам на вашем пути:

var contractData = contractObject.new.getData(someparam, another, {data: contractBytecode});
var estimate = web3.eth.estimateGas({data: contractData})

Ссылки:

web3.eth.estimateGas ()

Пример использования .getData () (Это четвертый вариант.)

ответил Matthew Schmidt 4 Jpm1000000pmWed, 04 Jan 2017 18:43:05 +030017 2017, 18:43:05
2

С web3js это довольно просто. Сначала вам нужно создать свой контракт. После создания у вас будет контрактABI и контрактный адрес следующим образом:

let contractABI = [ { "constant": true, "inputs": [ { "name": "", "type": "bytes32" }, { "name": "", "type": "uint256" } ], "name": "verify", "outputs": [ { "name": "", "type": "address", "value": "0x" } ], "payable": false, "type": "function" }, { "constant": false, "inputs": [ { "name": "document", "type": "bytes32" } ], "name": "sign", "outputs": [], "payable": false, "type": "function" } ]
let contractAddress = '0xaEC9eCDAFAf2404F824B4b7087e9E4F90C77D082'

С помощью этих данных просто создайте прокси-сервер контракта contractInstance и оцените tx по методу :

const web3conn = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
const contract = web3conn.eth.contract(contractABI)
const contractInstance = contract.at(contractAddress)
let estimatedGas = contractInstance.sign.estimateGas('arg of my function', { from: '0xAddress' })

Прокси-сервер - это специальный объект (с помощью console.log для просмотра всех методов), чтобы облегчить использование контракта. Если у вас есть метод знак , вы можете создать знак Tx:

let txHash = contractInstance.sign(param, { from: config.ethereum.identity, gas: estimatedGas })

, если вы используете wan't для вызова функции (без транзакции):

contractInstance.sign.call(param)
ответил Ellis 23 Maypm17 2017, 15:20:18

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

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

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