Отправка строки в качестве адреса в смартконтракт

У меня проблемы с отправкой адреса развернутому контракту, моя функция выглядит так:

function addNote(uint _value, address _owner) public { 
... 
}

и когда я отправляю параметры:

contract.deployed().then(function(instance) {
    return instance.addNote(value,"0x092f90acAbb3b23Aded64D59FB6f6Be97615476b");
})
.then(function(result) {
    console.log(result);
})
.catch(function(error) {
    console.log(error);
});

Я получаю эту ошибку:

Error: invalid address
at inputAddressFormatter (/Desktop/Server/node_modules/truffle-contract/node_modules/web3/lib/web3/formatters.js:274:11)

Также, когда я добавляю последний параметр:

{
    from: "0x092f90acAbb3b23Aded64D59FB6f6Be97615476b",
    gas: 1000000
}

тогда ошибка:

TypeError: Cannot read property 'constructor' of undefined
at /Desktop/Server/node_modules/truffle-contract/contract.js:96:1

В чем проблема?

Вы используете трюфель? Можете ли вы увеличить вывод ошибки? Вы указали адрес отправки? тот, который вы используете для отправки транзакции в качестве функции addNote?
да, трюфель, я отредактировал вопросы с более подробной информацией
пожалуйста, напишите, куда вы звоните constructor, что привело к этой ошибке Cannot read property 'constructor' of undefined, и ясно, что invalid addressошибка исчезла при добавлении fromатрибута.
внутренний адрес представляет собой массив из 20 байтов. Внутри строки указывается ее длина, а затем следуют строковые данные. Строка содержит данные в кодировке Unicode, а адрес содержит чистые байты. Оба типа совершенно несовместимы.
@Нулик, это правда. но что бы что то в солидности, а не в джаваскрипте. поэтому я предполагаю, что web3 автоматически выполняет преобразование и проверку типов.
@KakiMasterOfTime, ну, я не пользователь трюфеля, но в web3js это преобразование выполняется автоматически, когда вы кодируете inputсвой контракт в качестве extra dataпараметра транзакции. Вам просто нужно указать правильную спецификацию ABI. Теперь, если вы хотите управлять адресами как строками внутри контракта, это совершенно другая история, и вы можете делать все, что угодно, поскольку EVM является машиной Turing Complete и может выполнять любые общие вычисления.
почему бы вам не развернуть свой контракт gethвместо трюфеля, вы лучше поймете, как он работает. medium.com/@gus_tavo_guim/…
Что находится contract.jsв строке 96?

Ответы (1)

Адрес представляет собой 20-байтовое шестнадцатеричное число , поэтому вы не должны отправлять его в виде строки. Пытаться:

return instance.addNote(value, 0x092f90acAbb3b23Aded64D59FB6f6Be97615476b);

ОБНОВЛЕНИЕ : проблема не связана со строкой адреса. Пожалуйста, прочитайте ниже.

Запутанная часть в вашем конкретном примере заключается в том, что вы получаете ошибку, которая вводит вас в заблуждение, полагая, что с функцией что-то не так function addNote(uint _value, address _owner). Однако ошибка связана с невалидностью вашего web3.eth.defaultAccountадреса, то есть откуда выполняются вызовы вашего контракта.

Сразу после компиляции и переноса ваших контрактов сделайте следующее:

web3.eth.defaultAccount = web3.eth.accounts[0];
это не работает,
Перепроверьте ответ :) В конце концов я нашел проблему.
Теперь я сделал это и все еще ошибка Ошибка: недопустимо при inputAddressFormatter. Речь идет об адресе сервера, а не о том, что я перехожу к функции?
У вас не должно быть этой ошибки, если вы используете truffle developи следуете моему ответу выше. Я не уверен, какой адрес сервера вы используете. Загляните в эту тему , чтобы получить дополнительные советы.