¿Cómo envío un mensaje arbitrario a una dirección de Ethereum?

¿Cómo puedo enviar un mensaje a otra dirección de Ethereum? ¿Y cómo sabría ese usuario que recibe que es un mensaje? ¿Hay una billetera Ethereum que muestre que envié un mensaje a esa dirección? ¿Y cuál es el tamaño máximo que puedo enviar?

Respuestas (5)

Por lo tanto, solo es posible enviar datos HEX en el datacampo. Esta no será una transacción estándar, pero requerirá que use geth, la configuración avanzada de MyCrypto en la página de envío u otro cliente que le permita acceder y editar el datacampo.

  1. Google y visite un sitio ascii->hex y escriba su mensaje.

  2. Copie la salida hexadecimal y elimine todos los espacios en esa salida hexadecimal. Luego pégalo en el datacampo.

  3. En etherscan, puede hacer clic en "convertir a ascii" en la parte inferior de cualquier TX que tenga datos. Sin embargo, no todos los datos son datos ascii, por lo que a veces será un galimatías.

  4. Envié una demostración aquí . En "carga útil", puede ver los datos HEX a la izquierda y ASCII a la derecha.


Como señaló euro10 en los comentarios (pero es un poco difícil de leer), en realidad puede usar ascii incorporado -> hex si está usando 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')})

puede usar el ascii incorporado a hexadecimal si usa 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')})puede ver aquí etherchain.org/tx/…
Es mucho más fácil que esto. En el navegador Mist, puede simplemente copiar y pegar su cadena hexadecimal allí. Recalcula gas, etc. Rapid Tables es un buen sitio para convertir texto a hexadecimal. Esto es básicamente lo que hice aquí: medium.com/@tjayrush/…
¿Debo usar ASCII? UTF-8?
¿Cómo puedo recibir el mensaje? ¿Algún código js de muestra?
@tayvano, ¿Puede proporcionar un código de muestra para leer el mensaje?
Puede leer el mensaje convirtiendo hexadecimal a ascii. Desplácese hacia abajo en esta página e ingrese el HEX debajo de "hexadecimal" y elimine el prefijo 0x (si está allí): asciitohex.com . Aquí hay un tutorial de JS: w3resource.com/javascript-exercises/…
o use un sitio como ama.fans.

Al enviar un mensaje, supongo que quiere decir que desea enviar algún tipo de mensaje de texto a otro usuario...

  • Puede enviar un mensaje como parte del campo de datos en una transacción.
  • Para que el usuario sepa que realmente le envió un mensaje, puede usar la API web3.js para escuchar y extraer mensajes de una transacción. Luego tendría que decodificarlo a ascii para que sea legible por humanos.
  • No conozco una billetera que muestre que envió un mensaje específico a una dirección, pero una billetera como Mist mostrará que envió una transacción a una dirección determinada
  • Creo que hay un tamaño máximo para la transacción (que incluiría su mensaje). No estoy seguro, pero creo que actualmente es de alrededor de 80kb...?

Y una alternativa al enfoque anterior es utilizar un contrato para publicar un evento en la cadena de bloques. Luego, un cliente puede volver a escuchar estos eventos específicos utilizando la API web3.js.

Así es como lo haría con la 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);

Tengo un ejemplo de trabajo en blockchain en esta transacción 0x99f537b788c1e0c9513735c644921ffa423f8bd20ce45165403e8f12942aaca8 . Los datos ASCII en la transacción eran el mismo JavaScript que se usó para enviar la transacción.

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);

Hash Tx de ejemplo exitoso en rinkeBy test net 0xbc5ef9dc8da24c90d5910d93419f9746f3fe318cb2f2b5e7c873e64264bfcf53

Pregunta honesta, ¿por qué usar sendSignedTransactionen lugar de solo sendTransaction? ¿Qué beneficios tiene el firmado?
Es más flexible. Hay algunos beneficios de firmar con una clave privada que no posee web3. Por ejemplo, podrías cargar la clave privada desde un brainwallet o generarla sin conexión (a través de tiradas de dados)

Usas Whisper( https://github.com/ethereum/go-ethereum/wiki/Whisper )


Solución usando Web3.py:

He seguido el siguiente código de modo ssh .


receiver.pyque se ejecuta en el nodo-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'

Producción:

receiverPubK: 0x04226d96bf9857ac0ba429c1e8b480a2811ce47cb526dbd3829d7586e5cae740198ba291f3eca0f279f82db8a136be90ea9ec629ed6cd1d45cc7f873159811757d
Press Enter to continue...

Después Node_1de enviar los mensajes; He copiado impreso receiverPublicKeyen receiver_pubvariable en el siguiente código. Ejecuto el siguiente código en Node 2. Node 2envía un mensaje a la red. Luego presiono enter en Node_1e Node_1imprime el mensaje

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
})