Wie sende ich eine beliebige Nachricht an eine Ethereum-Adresse?

Wie kann ich eine Nachricht an eine andere Ethereum-Adresse senden? Und wie würde der empfangende Benutzer wissen, dass es sich um eine Nachricht handelt? Gibt es eine Ethereum-Brieftasche, die anzeigt, dass ich eine Nachricht an diese Adresse gesendet habe? Und was ist die maximale Größe, die ich senden kann?

Antworten (5)

Es können also nur HEX-Daten im dataFeld gesendet werden. Dies ist keine Standardtransaktion, sondern erfordert die Verwendung von Geth, erweiterten MyCrypto- Einstellungen auf der Sendeseite oder eines anderen Clients, mit dem Sie auf das dataFeld zugreifen und es bearbeiten können.

  1. Google und besuchen Sie eine ASCII->Hex-Site und geben Sie Ihre Nachricht ein.

  2. Kopieren Sie die hexadezimale Ausgabe und entfernen Sie alle Leerzeichen in dieser hexadezimalen Ausgabe. Fügen Sie es dann in das dataFeld ein.

  3. Auf Etherscan können Sie unten in jedem TX, das Daten enthält, auf „In ASCII konvertieren“ klicken. Nicht alle Daten sind jedoch ASCII-Daten, daher wird es manchmal Kauderwelsch geben.

  4. Ich habe hier eine Demo geschickt . Unter „Payload“ sehen Sie links die HEX-Daten und rechts die ASCII-Daten.


Wie euro10 in den Kommentaren betonte (aber es ist etwas schwer zu lesen), können Sie tatsächlich das integrierte ASCII -> Hex verwenden, wenn Sie Geth verwenden:

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

Sie können das eingebaute ASCII zu Hex verwenden, wenn Sie geth verwenden: eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(100,'finney'),data:web3.toHex('John Doe sent you a message')})Sie können hier etherchain.org/tx/… sehen .
Es ist viel einfacher als das. Im Mist-Browser können Sie einfach Ihre Hex-Zeichenfolge kopieren und dort einfügen. Es berechnet Gas usw. neu. Rapid Tables ist eine gute Seite, um Text in Hex umzuwandeln. Das ist im Grunde das, was ich hier gemacht habe: medium.com/@tjayrush/…
Muss ich ASCII verwenden? UTF-8?
Wie kann ich Nachrichten empfangen? Irgendein Beispiel-js-Code?
@tayvano, kannst du bitte einen Beispielcode zum Lesen der Nachricht bereitstellen?
Sie können die Nachricht lesen, indem Sie hex zurück in ASCII konvertieren. Scrollen Sie auf dieser Seite nach unten und geben Sie das HEX unter "hexadezimal" ein und entfernen Sie das vorangestellte 0x (falls vorhanden): asciitohex.com . Hier ist ein JS-Tutorial: w3resource.com/javascript-exercises/…
oder verwenden Sie Websites wie ama.fans.

Ich nehme an, dass Sie mit dem Senden einer Nachricht eine textbasierte Nachricht an einen anderen Benutzer senden möchten ...

  • Sie können eine Nachricht als Teil des Datenfelds in einer Transaktion senden.
  • Damit der Benutzer weiß, dass Sie ihm tatsächlich eine Nachricht gesendet haben, können Sie die web3.js-API verwenden, um Nachrichten aus einer Transaktion abzuhören und zu extrahieren. Sie müssten es dann in ASCII decodieren, um es für Menschen lesbar zu machen.
  • Mir ist keine Brieftasche bekannt, die anzeigt, dass Sie eine bestimmte Nachricht an eine Adresse gesendet haben, aber eine Brieftasche wie Mist zeigt an, dass Sie eine Transaktion an eine bestimmte Adresse gesendet haben
  • Ich glaube, es gibt eine maximale Größe für die Transaktion (die Ihre Nachricht enthalten würde). Ich bin mir nicht sicher, aber ich denke, es sind derzeit etwa 80 kb ...?

Eine Alternative zum obigen Ansatz besteht darin, einen Vertrag zu verwenden, um ein Ereignis in der Blockchain zu veröffentlichen. Ein Client kann dann mithilfe der web3.js-API erneut auf diese spezifischen Ereignisse lauschen.

So würden Sie es mit der web3-API machen.

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

Ich habe ein funktionierendes Beispiel für die Blockchain bei dieser Transaktion 0x99f537b788c1e0c9513735c644921ffa423f8bd20ce45165403e8f12942aaca8 . Die ASCII-Daten in der Transaktion waren das gleiche JavaScript, das zum Senden der Transaktion verwendet wurde.

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-Hash eines erfolgreichen Beispiels auf rinkeBy test net 0xbc5ef9dc8da24c90d5910d93419f9746f3fe318cb2f2b5e7c873e64264bfcf53

Ehrliche Frage, warum sendSignedTransactionstatt nur sendTransaction? Welche Vorteile hat der Signierte?
Es ist flexibler. Das Signieren mit einem privaten Schlüssel, der nicht im Besitz von web3 ist, hat einige Vorteile. Zum Beispiel könnten Sie den privaten Schlüssel aus einer Brainwallet laden oder offline generieren (durch Würfelwürfe).

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


Lösung mit Web3.py:

Ich habe folgenden SSH-Modus-Code befolgt .


receiver.pydas läuft auf 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,
)

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'

Ausgabe:

receiverPubK: 0x04226d96bf9857ac0ba429c1e8b480a2811ce47cb526dbd3829d7586e5cae740198ba291f3eca0f279f82db8a136be90ea9ec629ed6cd1d45cc7f873159811757d
Press Enter to continue...

Nachdem Node_1die Nachrichten von gesendet wurden; Ich habe den folgenden Code receiverPublicKeyin eine Variable kopiert . receiver_pubIch führe folgenden Code auf Node 2. Node 2sendet eine Nachricht an das Netzwerk. Später drücke ich die Eingabetaste Node_1und Node_1drucke die Nachricht

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