eth-lightwallet: в чем разница между functionTx и valueTx?

В eth-lightwallet есть два типа функций создания Tx;

txutils.valueTx(txObject)

а также

txutils.functionTx(abi, functionName, args, txObject)

Я предполагаю, что; хотя их входные данные очень разные, они оба приводят к Txобъекту, который выглядит следующим образом:

tx = {
  nonce: '..',
  gasPrice: '..', 
  gasLimit: '..',
  to: '..', 
  value: '..', 
  data: '...'
}

и единственная разница в том, что dataпусто в valueTx, и это шестнадцатеричная версия вызова функции в functionTx. Это правильно? dataЕдинственная разница между двумя ?

Кроме того, как я могу вычислить dataсебя, зная адрес контракта, abi и имя/параметры функции? Есть ли другая библиотека для этого?

Спасибо,

Ответы (1)

Разница между ними заключается в том, что valueTx просто создает транзакцию, которая отправляет «значение» (эфир/wei и т. д.) на определенный адрес в блокчейне, в отличие от functionTx, который создает транзакцию, выполняющую функцию в блокчейне (примечание что в этом случае вы также можете передать «значение» вместе с вызовом функции).

Аргумент «данные» представляет собой шестнадцатеричное представление аргументов, которые получает функция, и существует несколько различных методов его создания.

Я не уверен, как вы используете библиотеку, но если вы используете web3, то, на мой взгляд, самый простой способ — сгенерировать данные, вызвав getData для объекта функции.

Например, если вы хотите создать шестнадцатеричные данные, представляющие аргументы, которые вы хотите передать функции «foo», вы можете сделать следующее:

// for a given foo function in the contract -
// function foo(uint256 a, uint256 b) {}

// create a contract instance -
var contract = web3.eth.contract(contractAbi);

// generate the hex data for the arguments
var data = contract.foo.getData(100, 200);

// at this point, data value will be the hex string that
// represents the "100,  200" arguments.
// note that you might need to add the '0x' prefix to
// the data if it's not already there, some wallets are strict about it
Большой! getDataпохоже на то, что я ищу. Поэтому я предполагаю, что могу отправить 0-значение valueTx(вместо functionTx), просто добавив data: contract.foo.getData().
Это зависит от того, чего вы пытаетесь достичь - я не вижу смысла в использовании valueTx без передачи значения, поскольку это было бы эквивалентно отправке 0 wei на адрес (если только это не то, что вы пытаетесь сделать для некоторая причина). В большинстве случаев, если вы хотите передать значение 0, это означает, что вы хотите выполнить функцию, и поэтому вы будете использовать functionTx.
Я просто хочу использовать другую библиотеку создания (и подписи) транзакций для вызова функции, поэтому я хочу узнать, имеют ли они одинаковую структуру.
Ах, в таком случае, конечно. Вы можете просто сгенерировать данные, используя вызов contract.foo.getData(), а затем передать эти данные вместе с другими аргументами в библиотеку, которую вы используете (со значением 0).