Как отправить произвольное сообщение на адрес Ethereum?

Как я могу отправить сообщение на другой адрес Ethereum? И как этот получающий пользователь узнает, что это сообщение? Есть ли кошелек Ethereum, который покажет, что я отправил сообщение на этот адрес? И какой максимальный размер я могу отправить?

Ответы (5)

dataТаким образом, в поле можно отправлять только HEX-данные . Это не будет стандартной транзакцией, но вам потребуется использовать geth , расширенные настройки MyCrypto на странице отправки или другой клиент, который позволяет вам получать доступ и редактировать dataполе.

  1. Google и посетите сайт ascii->hex и введите свое сообщение.

  2. Скопируйте шестнадцатеричный вывод и удалите все пробелы в этом шестнадцатеричном выводе. Затем вставьте его в dataполе.

  3. На etherscan вы можете щелкнуть «конвертировать в ascii» в нижней части любого TX, в котором есть данные. Однако не все данные представляют собой данные ascii, поэтому иногда это будет тарабарщина.

  4. Я отправил демо здесь . В разделе «полезная нагрузка» вы можете увидеть данные HEX слева и ASCII справа.


Как указано в комментариях euro10 (но это немного трудно читать), вы можете использовать встроенный ascii -> hex, если вы используете geth:

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(1‌​00,'finney'),data:web3.toHex('John Doe sent you a message')})

вы можете использовать встроенный ascii для шестнадцатеричного преобразования, если вы используете geth: eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(100,'finney'),data:web3.toHex('John Doe sent you a message')})вы можете увидеть здесь etherchain.org/tx/…
Это намного проще, чем это. В браузере Mist вы можете просто скопировать и вставить туда свою шестнадцатеричную строку. Он пересчитывает газ и т. д. Rapid Tables — хороший сайт для преобразования текста в шестнадцатеричный формат. Это в основном то, что я сделал здесь: medium.com/@tjayrush/…
Должен ли я использовать ASCII? UTF-8?
Как я могу получить сообщение? Любой пример кода js?
@tayvano, не могли бы вы предоставить пример кода для чтения сообщения?
Вы можете прочитать сообщение, преобразовав шестнадцатеричный обратно в ascii. Прокрутите эту страницу вниз и введите HEX в поле «шестнадцатеричный» и удалите префикс 0x (если он есть): asciitohex.com . Вот учебник по JS: w3resource.com/javascript-exercises/…
или используйте такой сайт, как ama.fans.

Отправляя сообщение, я предполагаю, что вы имеете в виду, что хотите отправить какое-либо текстовое сообщение другому пользователю...

  • Вы можете отправить сообщение как часть поля данных в транзакции.
  • Чтобы пользователь знал, что вы действительно отправили ему сообщение, вы можете использовать API web3.js для прослушивания и извлечения сообщений из транзакции. Затем вам придется декодировать его в ascii, чтобы сделать его понятным для человека.
  • Я не знаю кошелька, который покажет, что вы отправили определенное сообщение на адрес, но кошелек, такой как Mist, покажет, что вы отправили транзакцию на указанный адрес.
  • Я считаю, что существует максимальный размер транзакции (включая ваше сообщение). Я не уверен, но я думаю, что в настоящее время это около 80 КБ ...?

И альтернативой описанному выше подходу является использование контракта для публикации события в блокчейне. Затем клиент может снова прослушивать эти конкретные события с помощью API web3.js.

Вот как вы могли бы сделать это с API web3.

const Utils = require('web3-utils');
let txTransfer = {};
txTransfer.from = from.address;
txTransfer.to = to.address;
txTransfer.gas = GasLimit;
txTransfer.value = amount;
txTransfer.data = Utils.toHex('free text data');
web3.eth.sendTransaction(txTransfer);

У меня есть рабочий пример на блокчейне по этой транзакции 0x99f537b788c1e0c9513735c644921ffa423f8bd20ce45165403e8f12942aaca8 . Данные ascii в транзакции были тем же JavaScript, который использовался для отправки транзакции.

web3js v1.xx

const txParams = {
  nonce: nonce,
  gasPrice: gasPrice,
  gasLimit: gasLimit,
  to: to,
  value: value,
  data : web3.utils.toHex('rockstar blockchain developer'),
  // EIP 155 chainId - mainnet: 1, ropsten: 3
  chainId: 4
}

const tx = new ethereumTx(txParams);

tx.sign(privateKey);
const serializedTx = '0x'+tx.serialize().toString('hex')

console.log("serializedTx" ,serializedTx );
web3.eth.sendSignedTransaction(serializedTx);

Хэш Tx успешного примера на тестовой сети rinkeBy 0xbc5ef9dc8da24c90d5910d93419f9746f3fe318cb2f2b5e7c873e64264bfcf53

Честный вопрос, зачем использовать sendSignedTransactionвместо просто sendTransaction? Какие преимущества имеет подписанный?
Он более гибкий. Есть некоторые преимущества в подписании закрытым ключом, который не хранится в web3. Например, вы можете загрузить закрытый ключ из мозгового кошелька или сгенерировать в автономном режиме (через броски костей).

Вы используете Whisper( https://github.com/ethereum/go-ethereum/wiki/Whisper )


Решение с использованием Web3.py:

Я следовал следующему коду ssh-режима .


receiver.pyкоторый работает на узле-1:

from web3 import Web3, HTTPProvider
web3 = Web3(HTTPProvider('http://localhost:8545'))
from web3.shh import Shh
Shh.attach(web3, "shh")

import time, sys;

from hexbytes import (
    HexBytes,
)

kId = web3.shh.newKeyPair()
receiver_pub = web3.shh.getPublicKey(kId)
print('receiverPubK: ' + receiver_pub);

topic = '0x07678231'

shh_filter = web3.shh.newMessageFilter({
    'privateKeyID': kId,
    'topics': [topic]
})

input("Press Enter to continue...");

received_messages = [];
received_messages = shh_filter.get_new_entries()
print(len(received_messages)) # Returns '0'
print(web3.shh.info.memory)  # Returns '0'

Выход:

receiverPubK: 0x04226d96bf9857ac0ba429c1e8b480a2811ce47cb526dbd3829d7586e5cae740198ba291f3eca0f279f82db8a136be90ea9ec629ed6cd1d45cc7f873159811757d
Press Enter to continue...

После Node_1отправки сообщений; Я скопировал напечатанное receiverPublicKeyв receiver_pubпеременную в следующем коде. Я запускаю следующий код на Node 2. Node 2отправляет сообщение в сеть. Позже я нажимаю Enter Node_1и Node_1печатаю сообщение

from web3 import Web3, HTTPProvider
web3 = Web3(HTTPProvider('http://localhost:8545'))
from web3.shh import Shh
Shh.attach(web3, "shh")

import time, sys;

from hexbytes import (
    HexBytes,
)

receiver_pub='0x04226d96bf9857ac0ba429c1e8b480a2811ce47cb526dbd3829d7586e5cae740198ba291f3eca0f279f82db8a136be90ea9ec629ed6cd1'; # obtained from node_1 and assigned here.

topic = '0x07678231'
payloads = [web3.toHex(text="test message :)"), web3.toHex(text="2nd test message")]

web3.shh.post({
        'powTarget': 2.5,
        'powTime': 2,
        'ttl': 60,
        'payload': payloads[0],
        'topic': topic,
        'pubKey': receiver_pub
})