Вызов RPC с Metamask

Я хочу создать вызов RPC (цель исследования) из своего приложения, используя метамаску.

Мой метод по моему контракту:

function sayHelloMyName(string memory _name) external pure returns (string memory) {      
        require(bytes(_name).length != 0, "insert your name");
        return string(abi.encodePacked("hello ", _name));
    }

его хэш:

$ web3.utils.keccak256("sayHelloMyName(string)").substr(0, 10)
> '0x10a7b27a'

Я хочу передать свое имя foo, где шестнадцатеричное десятичное число равно 0x666f6f.

web3.utils.toHex('foo')
'0x666f6f'

Итак, мой призыв:

ethereum
    .request({
      method: 'eth_call',
      params: [
        {
          from: currentAccount,
          to: contractAddress,
          data: 0x10a7b27a0000000000000000000000000000000000000000000000000000000000666f6f
        }, "latest"],
    })
    .then((txHash) => {
      console.info(txHash);
      $('#info').html(txHash);
    })
    .catch((error) => {
      console.error;
      $('#info').text(JSON.stringify(error.message));
    });

где данные — это сигнатура метода, мое шестнадцатеричное имя и заполнение (всего 32 байта) К сожалению, я получаю возврат этого.

{
    "jsonrpc": "2.0",
    "id": 1,
    "error": {
        "code": -32000,
        "message": "execution reverted"
    }
}

код работает, я могу использовать его с библиотекой web3.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Solidity string кодируется как массив байтов динамической длины, включая первый 32-байтовый слот, указывающий на расположение начала массива, и второй 32-байтовый слот, содержащий длину строки. Значение: Не только шестнадцатеричное значение строки, которую вы передаете.

Это работает с web3js, потому что библиотека JS декодирует возвращает шестнадцатеричный код к строке (web3 предполагает, что ввод шестнадцатеричный, так как он начинается с 0x), а затем кодирует правильно к массиву байтов при заполнении поля data.

Смотрите вывод этого web3js фрагмента

const data = web3.eth.abi.encodeFunctionCall({
    name: 'sayHelloMyName',
    type: 'function',
    inputs: [{
        type: 'string',
        name: '_name'
    }]
}, [
    'foo',
]);
console.info(data);

который печатает

# formatted for readability
0x10a7b27a
0000000000000000000000000000000000000000000000000000000000000020
0000000000000000000000000000000000000000000000000000000000000003
666f6f0000000000000000000000000000000000000000000000000000000000
  • Первый слот — это указатель на место, где начинается массив. В данном случае (hex20 == dec32) это начало второго слота.
  • Второй слот (значение 3) - это длина значений
  • И третий слот содержит фактическое шестнадцатеричное значение строки

Решение: Это длинное значение (без новой строки) — это то, что вам нужно вместо этого передать.

Удивительно, это ответ, который я ищу!

foo_bar 07.04.2022 11:40

Итак, если я хочу использовать eth_sendTransaction с метамаской со значением и данными, я должен создать данные с подписью метода (4 байта) + параметры, которые я могу создать с помощью encodeParam, как вы сказали, значение в шестнадцатеричном формате. Потому что с web3.eth.sendTransaction мне нужен закрытый ключ пользователя, поэтому я предполагаю, что sendTransaction предназначен для «серверной стороны». Спасибо за ваше время.

foo_bar 07.04.2022 12:17

честно говоря, у меня есть сомнения по поводу hex20, первого слота, где я могу найти больше информации о нем?

foo_bar 07.04.2022 12:18

@foo_bar См. offset о первом слоте: docs.soliditylang.org/en/v0.8.13/…

Petr Hejda 07.04.2022 12:52

Другие вопросы по теме