importjsonimportosimporttimeimporturllib.errorimporturllib.requestfrombinasciiimporthexlifyfromsymbolchain.CryptoTypesimportPrivateKey,PublicKeyfromsymbolchain.facade.SymbolFacadeimportSymbolFacadefromsymbolchain.symbol.MessageEncoderimportMessageEncoder# ConfigurationNODE_URL=os.getenv("NODE_URL","https://reference.symboltest.net:3001")print(f"Using node {NODE_URL}")# Helper function to poll for confirmed transactiondefretrieve_confirmed_transaction(hash_value,label):print(f"Polling for {label} confirmation...")attempts=0max_attempts=60whileattempts<max_attempts:try:url=f"{NODE_URL}/transactions/confirmed/{hash_value}"withurllib.request.urlopen(url)astransaction_confirmed:print(f" {label} confirmed!")returnjson.loads(transaction_confirmed.read().decode())excepturllib.error.HTTPError:# Transaction not yet confirmedpassattempts+=1time.sleep(2)raiseTimeoutError(f"{label} not confirmed after {max_attempts} attempts")# Set up sender and recipient accountsfacade=SymbolFacade("testnet")sender_private_key_string=os.getenv("SENDER_PRIVATE_KEY","0000000000000000000000000000000000000000000000000000000000000000",)sender_key_pair=facade.KeyPair(PrivateKey(sender_private_key_string))sender_address=facade.network.public_key_to_address(sender_key_pair.public_key)recipient_private_key_string=os.getenv("RECIPIENT_PRIVATE_KEY","1111111111111111111111111111111111111111111111111111111111111111",)recipient_key_pair=facade.KeyPair(PrivateKey(recipient_private_key_string))recipient_address=facade.network.public_key_to_address(recipient_key_pair.public_key)print(f"Sender address: {sender_address}")print(f"Recipient address: {recipient_address}\n")# Fetch recommended feesfee_path="/network/fees/transaction"print(f"Fetching recommended fees from {fee_path}")withurllib.request.urlopen(f"{NODE_URL}{fee_path}")asresponse:response_json=json.loads(response.read().decode())median_multiplier=response_json["medianFeeMultiplier"]minimum_multiplier=response_json["minFeeMultiplier"]fee_multiplier=max(median_multiplier,minimum_multiplier)print(f" Fee multiplier: {fee_multiplier}\n")# --- PLAIN TEXT MESSAGE ---print("==> Sending Plain Text Message")# Create a plain text messageplain_message="Hello, Symbol!".encode("utf-8")print(f"Plain message: {plain_message.decode('utf-8')}")# Build transfer transaction with plain messageplain_transaction=facade.create_transaction_from_descriptor({"type":"transfer_transaction_v1","recipient_address":recipient_address,"mosaics":[],"message":plain_message,},sender_key_pair.public_key,fee_multiplier,2*60*60)# Sign and announce the transactionplain_signature=facade.sign_transaction(sender_key_pair,plain_transaction)plain_json_payload=facade.transaction_factory.attach_signature(plain_transaction,plain_signature)plain_transaction_hash=facade.hash_transaction(plain_transaction)print(f"Transaction hash: {plain_transaction_hash}")plain_announce_request=urllib.request.Request(f"{NODE_URL}/transactions",data=plain_json_payload.encode("utf-8"),headers={"Content-Type":"application/json"},method="PUT",)withurllib.request.urlopen(plain_announce_request)asresponse:print("Plain message transaction announced\n")# --- RECEIVING PLAIN TEXT MESSAGE ---print("<== Receiving Plain Text Message")# Wait for confirmationplain_tx_data=retrieve_confirmed_transaction(plain_transaction_hash,"Plain message transaction")# Decode plain message from confirmed transactionreceived_plain_message=bytes.fromhex(plain_tx_data["transaction"]["message"])print(f'Received plain message: {received_plain_message.decode("utf-8")}\n')# --- ENCRYPTED MESSAGE ---print("==> Sending Encrypted Message")# Create a message encoder with sender's key pairsender_message_encoder=MessageEncoder(sender_key_pair)# Encrypt the message using recipient's public keysecret_message="This is a secret message!".encode("utf-8")encrypted_payload=sender_message_encoder.encode(recipient_key_pair.public_key,secret_message)print(f"Original message: {secret_message.decode('utf-8')}")print(f"Encrypted payload: {hexlify(encrypted_payload).decode("utf-8")}")# Build transfer transaction with encrypted messageencrypted_transaction=facade.create_transaction_from_descriptor({"type":"transfer_transaction_v1","recipient_address":recipient_address,"mosaics":[],"message":encrypted_payload,},sender_key_pair.public_key,fee_multiplier,2*60*60)# Sign and announce the transactionencrypted_signature=facade.sign_transaction(sender_key_pair,encrypted_transaction)encrypted_json_payload=facade.transaction_factory.attach_signature(encrypted_transaction,encrypted_signature)encrypted_transaction_hash=facade.hash_transaction(encrypted_transaction)print(f"Transaction hash: {encrypted_transaction_hash}")encrypted_announce_request=urllib.request.Request(f"{NODE_URL}/transactions",data=encrypted_json_payload.encode("utf-8"),headers={"Content-Type":"application/json"},method="PUT",)withurllib.request.urlopen(encrypted_announce_request)asresponse:print("Encrypted message transaction announced\n")# --- RECEIVING ENCRYPTED MESSAGE ---print("<== Receiving Encrypted Message")# Wait for confirmationencrypted_tx_data=retrieve_confirmed_transaction(encrypted_transaction_hash,"Encrypted message transaction")# Decode encrypted message using recipient's private keyrecipient_message_encoder=MessageEncoder(recipient_key_pair)received_encrypted_message=bytes.fromhex(encrypted_tx_data["transaction"]["message"])# Get sender's public key from the transactionsender_public_key_from_tx=PublicKey(encrypted_tx_data["transaction"]["signerPublicKey"])(is_decoded,decrypted_message)=recipient_message_encoder.try_decode(sender_public_key_from_tx,received_encrypted_message)ifis_decoded:message_text=decrypted_message.decode("utf-8")print(f"Recipient decrypted message: {message_text}")else:print("Recipient failed to decrypt message")
import{PrivateKey,PublicKey}from'symbol-sdk';import{MessageEncoder,SymbolFacade,descriptors}from'symbol-sdk/symbol';// ConfigurationconstNODE_URL=process.env.NODE_URL||'https://reference.symboltest.net:3001';console.log('Using node',NODE_URL);// Helper function to poll for confirmed transactionasyncfunctionretrieveConfirmedTransaction(hash,label){console.log(`Polling for ${label} confirmation...`);letattempts=0;constmaxAttempts=60;while(attempts<maxAttempts){try{consttransaction_confirmed=awaitfetch(`${NODE_URL}/transactions/confirmed/${hash}`);if(transaction_confirmed.ok){console.log(` ${label} confirmed!`);returnawaittransaction_confirmed.json();}}catch{// Transaction not yet confirmed}attempts++;awaitnewPromise(resolve=>{setTimeout(resolve,2000);});}thrownewError(`${label} not confirmed after ${maxAttempts} attempts`);}// Set up sender and recipient accountsconstfacade=newSymbolFacade('testnet');constsenderPrivateKeyString=process.env.SENDER_PRIVATE_KEY||'0000000000000000000000000000000000000000000000000000000000000000';constsenderKeyPair=newSymbolFacade.KeyPair(newPrivateKey(senderPrivateKeyString));constsenderAddress=facade.network.publicKeyToAddress(senderKeyPair.publicKey);constrecipientPrivateKeyString=process.env.RECIPIENT_PRIVATE_KEY||'1111111111111111111111111111111111111111111111111111111111111111';constrecipientKeyPair=newSymbolFacade.KeyPair(newPrivateKey(recipientPrivateKeyString));constrecipientAddress=facade.network.publicKeyToAddress(recipientKeyPair.publicKey);console.log('Sender address:',senderAddress.toString());console.log('Recipient address:',recipientAddress.toString(),'\n');// Fetch recommended feesconstfeePath='/network/fees/transaction';console.log('Fetching recommended fees from',feePath);constfeeResponse=awaitfetch(`${NODE_URL}${feePath}`);constfeeJSON=awaitfeeResponse.json();constmedianMultiplier=feeJSON.medianFeeMultiplier;constminimumMultiplier=feeJSON.minFeeMultiplier;constfeeMultiplier=Math.max(medianMultiplier,minimumMultiplier);console.log(' Fee multiplier:',feeMultiplier,'\n');// --- PLAIN TEXT MESSAGE ---console.log('==> Sending Plain Text Message');// Create a plain text messageconstplainMessage=newTextEncoder().encode('Hello, Symbol!');console.log('Plain message:',newTextDecoder().decode(plainMessage));// Build transfer transaction with plain messageconstplainTransaction=facade.createTransactionFromTypedDescriptor(newdescriptors.TransferTransactionV1Descriptor(recipientAddress,[],plainMessage),senderKeyPair.publicKey,feeMultiplier,2*60*60);// Sign and announce the transactionconstplainSignature=facade.signTransaction(senderKeyPair,plainTransaction);constplainJsonPayload=facade.transactionFactory.static.attachSignature(plainTransaction,plainSignature);constplainTransactionHash=facade.hashTransaction(plainTransaction).toString();console.log('Transaction hash:',plainTransactionHash);awaitfetch(`${NODE_URL}/transactions`,{method:'PUT',headers:{'Content-Type':'application/json'},body:plainJsonPayload});console.log('Plain message transaction announced\n');// --- RECEIVING PLAIN TEXT MESSAGE ---console.log('<== Receiving Plain Text Message');// Wait for confirmationconstplainTxData=awaitretrieveConfirmedTransaction(plainTransactionHash,'Plain message transaction');// Decode plain message from confirmed transactionconstreceivedPlainMessage=Buffer.from(plainTxData.transaction.message,'hex');console.log('Received plain message:',newTextDecoder().decode(receivedPlainMessage),'\n');// --- ENCRYPTED MESSAGE ---console.log('==> Sending Encrypted Message');// Create a message encoder with sender's key pairconstsenderMessageEncoder=newMessageEncoder(senderKeyPair);// Encrypt the message using recipient's public keyconstsecretMessage=newTextEncoder().encode('This is a secret message!');constencryptedPayload=senderMessageEncoder.encode(recipientKeyPair.publicKey,secretMessage);console.log('Original message:',newTextDecoder().decode(secretMessage));console.log('Encrypted payload:',Buffer.from(encryptedPayload).toString('hex'));// Build transfer transaction with encrypted messageconstencryptedTransaction=facade.createTransactionFromTypedDescriptor(newdescriptors.TransferTransactionV1Descriptor(recipientAddress,[],encryptedPayload),senderKeyPair.publicKey,feeMultiplier,2*60*60);// Sign and announce the transactionconstencryptedSignature=facade.signTransaction(senderKeyPair,encryptedTransaction);constencryptedJsonPayload=facade.transactionFactory.static.attachSignature(encryptedTransaction,encryptedSignature);constencryptedTransactionHash=facade.hashTransaction(encryptedTransaction).toString();console.log('Transaction hash:',encryptedTransactionHash);awaitfetch(`${NODE_URL}/transactions`,{method:'PUT',headers:{'Content-Type':'application/json'},body:encryptedJsonPayload});console.log('Encrypted message transaction announced\n');// --- RECEIVING ENCRYPTED MESSAGE ---console.log('<== Receiving Encrypted Message');// Wait for confirmationconstencryptedTxData=awaitretrieveConfirmedTransaction(encryptedTransactionHash,'Encrypted message transaction');// Decode encrypted message using recipient's private keyconstrecipientMessageEncoder=newMessageEncoder(recipientKeyPair);constreceivedEncryptedMessage=Buffer.from(encryptedTxData.transaction.message,'hex');// Get sender's public key from the transactionconstsenderPublicKeyFromTx=newPublicKey(encryptedTxData.transaction.signerPublicKey);constresult=recipientMessageEncoder.tryDecode(senderPublicKeyFromTx,receivedEncryptedMessage);if(result.isDecoded){console.log('Recipient decrypted message:',newTextDecoder().decode(result.message));}else{console.log('Recipient failed to decrypt message');}
//JAVA 21+//DEPS org.symbol:symbol-sdk:3.3.1importjava.io.IOException;importjava.net.URI;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;importjava.net.http.HttpResponse.BodyHandlers;importjava.nio.charset.StandardCharsets;importjava.util.HexFormat;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.symbol.sdk.CryptoTypes;importorg.symbol.sdk.MessageEncoderResult;importorg.symbol.sdk.facade.SymbolFacade;importorg.symbol.sdk.symbol.Address;importorg.symbol.sdk.symbol.KeyPair;importorg.symbol.sdk.symbol.MessageEncoder;importorg.symbol.sdk.symbol.SymbolTransactionFactory;importorg.symbol.sdk.symbol.descriptors.*;importorg.symbol.sdk.symbol.models.Transaction;publicfinalclassMessages{privatestaticfinalObjectMapperJSON_MAPPER=newObjectMapper();privatestaticfinalHttpClientHTTP_CLIENT=HttpClient.newHttpClient();// ConfigurationprivatefinalStringnodeUrl=System.getenv().getOrDefault("NODE_URL","https://reference.symboltest.net:3001");privatefinalSymbolFacadefacade=newSymbolFacade("testnet");// Helper function to poll for confirmed transactionprivateJsonNoderetrieveConfirmedTransaction(finalStringhash,finalStringlabel)throwsIOException,InterruptedException{System.out.printf("Polling for %s confirmation...%n",label);intattempts=0;finalintmaxAttempts=60;while(attempts<maxAttempts){try{finalHttpRequesttransactionConfirmed=HttpRequest.newBuilder(URI.create(nodeUrl+"/transactions/confirmed/"+hash)).GET().build();finalHttpResponse<String>response=HTTP_CLIENT.send(transactionConfirmed,BodyHandlers.ofString());if(response.statusCode()/100==2){System.out.printf(" %s confirmed!%n",label);returnJSON_MAPPER.readTree(response.body());}}catch(finalIOExceptionex){// Transaction not yet confirmed}++attempts;Thread.sleep(2000);}thrownewIOException(String.format("%s not confirmed after %d attempts",label,maxAttempts));}publicstaticvoidmain(finalString[]args){try{newMessages().run();}catch(finalExceptionex){System.out.println(null==ex.getMessage()?ex.toString():ex.getMessage());}}privatevoidrun()throwsIOException,InterruptedException{System.out.printf("Using node %s%n",nodeUrl);// Set up sender and recipient accountsfinalStringsenderPrivateKeyString=System.getenv().getOrDefault("SENDER_PRIVATE_KEY","0".repeat(64));finalKeyPairsenderKeyPair=newKeyPair(newCryptoTypes.PrivateKey(senderPrivateKeyString));finalAddresssenderAddress=facade.network.publicKeyToAddress(senderKeyPair.getPublicKey());finalStringrecipientPrivateKeyString=System.getenv().getOrDefault("RECIPIENT_PRIVATE_KEY","1".repeat(64));finalKeyPairrecipientKeyPair=newKeyPair(newCryptoTypes.PrivateKey(recipientPrivateKeyString));finalAddressrecipientAddress=facade.network.publicKeyToAddress(recipientKeyPair.getPublicKey());System.out.printf("Sender address: %s%n",senderAddress);System.out.printf("Recipient address: %s%n%n",recipientAddress);// Fetch recommended feesfinalStringfeePath="/network/fees/transaction";System.out.printf("Fetching recommended fees from %s%n",feePath);finalHttpRequestfeeRequest=HttpRequest.newBuilder(URI.create(nodeUrl+feePath)).GET().build();finalHttpResponse<String>feeResponse=HTTP_CLIENT.send(feeRequest,BodyHandlers.ofString());finalJsonNodefeeJSON=JSON_MAPPER.readTree(feeResponse.body());finallongmedianMultiplier=feeJSON.get("medianFeeMultiplier").asLong();finallongminimumMultiplier=feeJSON.get("minFeeMultiplier").asLong();finallongfeeMultiplier=Math.max(medianMultiplier,minimumMultiplier);System.out.printf(" Fee multiplier: %d%n%n",feeMultiplier);// --- PLAIN TEXT MESSAGE ---System.out.println("==> Sending Plain Text Message");// Create a plain text messagefinalbyte[]plainMessage="Hello, Symbol!".getBytes(StandardCharsets.UTF_8);System.out.printf("Plain message: %s%n",newString(plainMessage,StandardCharsets.UTF_8));// Build transfer transaction with plain messagefinalTransactionplainTransaction=facade.createTransactionFromTypedDescriptor(newTransferTransactionV1Descriptor(recipientAddress,null,plainMessage),senderKeyPair.getPublicKey(),feeMultiplier,2*60*60);// Sign and announce the transactionfinalCryptoTypes.SignatureplainSignature=facade.signTransaction(senderKeyPair,plainTransaction);finalStringplainJsonPayload=SymbolTransactionFactory.attachSignature(plainTransaction,plainSignature);finalStringplainTransactionHash=facade.hashTransaction(plainTransaction).toString();System.out.printf("Transaction hash: %s%n",plainTransactionHash);put("/transactions",plainJsonPayload);System.out.println("Plain message transaction announced\n");// --- RECEIVING PLAIN TEXT MESSAGE ---System.out.println("<== Receiving Plain Text Message");// Wait for confirmationfinalJsonNodeplainTxData=retrieveConfirmedTransaction(plainTransactionHash,"Plain message transaction");// Decode plain message from confirmed transactionfinalbyte[]receivedPlainMessage=HexFormat.of().parseHex(plainTxData.get("transaction").get("message").asText());System.out.printf("Received plain message: %s%n%n",newString(receivedPlainMessage,StandardCharsets.UTF_8));// --- ENCRYPTED MESSAGE ---System.out.println("==> Sending Encrypted Message");// Create a message encoder with sender's key pairfinalMessageEncodersenderMessageEncoder=newMessageEncoder(senderKeyPair);// Encrypt the message using recipient's public keyfinalbyte[]secretMessage="This is a secret message!".getBytes(StandardCharsets.UTF_8);finalbyte[]encryptedPayload=senderMessageEncoder.encode(recipientKeyPair.getPublicKey(),secretMessage);System.out.printf("Original message: %s%n",newString(secretMessage,StandardCharsets.UTF_8));System.out.printf("Encrypted payload: %s%n",HexFormat.of().formatHex(encryptedPayload));// Build transfer transaction with encrypted messagefinalTransactionencryptedTransaction=facade.createTransactionFromTypedDescriptor(newTransferTransactionV1Descriptor(recipientAddress,null,encryptedPayload),senderKeyPair.getPublicKey(),feeMultiplier,2*60*60);// Sign and announce the transactionfinalCryptoTypes.SignatureencryptedSignature=facade.signTransaction(senderKeyPair,encryptedTransaction);finalStringencryptedJsonPayload=SymbolTransactionFactory.attachSignature(encryptedTransaction,encryptedSignature);finalStringencryptedTransactionHash=facade.hashTransaction(encryptedTransaction).toString();System.out.printf("Transaction hash: %s%n",encryptedTransactionHash);put("/transactions",encryptedJsonPayload);System.out.println("Encrypted message transaction announced\n");// --- RECEIVING ENCRYPTED MESSAGE ---System.out.println("<== Receiving Encrypted Message");// Wait for confirmationfinalJsonNodeencryptedTxData=retrieveConfirmedTransaction(encryptedTransactionHash,"Encrypted message transaction");// Decode encrypted message using recipient's private keyfinalMessageEncoderrecipientMessageEncoder=newMessageEncoder(recipientKeyPair);finalbyte[]receivedEncryptedMessage=HexFormat.of().parseHex(encryptedTxData.get("transaction").get("message").asText());// Get sender's public key from the transactionfinalCryptoTypes.PublicKeysenderPublicKeyFromTx=newCryptoTypes.PublicKey(encryptedTxData.get("transaction").get("signerPublicKey").asText());finalMessageEncoderResultresult=recipientMessageEncoder.tryDecode(senderPublicKeyFromTx,receivedEncryptedMessage);if(result.isDecoded()){System.out.printf("Recipient decrypted message: %s%n",newString((byte[])result.message(),StandardCharsets.UTF_8));}else{System.out.println("Recipient failed to decrypt message");}}privatevoidput(finalStringpath,finalStringpayload)throwsIOException,InterruptedException{finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(nodeUrl+path)).header("Content-Type","application/json").PUT(HttpRequest.BodyPublishers.ofString(payload)).build();HTTP_CLIENT.send(request,BodyHandlers.ofString());}}
# Set up sender and recipient accountsfacade=SymbolFacade("testnet")sender_private_key_string=os.getenv("SENDER_PRIVATE_KEY","0000000000000000000000000000000000000000000000000000000000000000",)sender_key_pair=facade.KeyPair(PrivateKey(sender_private_key_string))sender_address=facade.network.public_key_to_address(sender_key_pair.public_key)recipient_private_key_string=os.getenv("RECIPIENT_PRIVATE_KEY","1111111111111111111111111111111111111111111111111111111111111111",)recipient_key_pair=facade.KeyPair(PrivateKey(recipient_private_key_string))recipient_address=facade.network.public_key_to_address(recipient_key_pair.public_key)print(f"Sender address: {sender_address}")print(f"Recipient address: {recipient_address}\n")
// Set up sender and recipient accountsconstfacade=newSymbolFacade('testnet');constsenderPrivateKeyString=process.env.SENDER_PRIVATE_KEY||'0000000000000000000000000000000000000000000000000000000000000000';constsenderKeyPair=newSymbolFacade.KeyPair(newPrivateKey(senderPrivateKeyString));constsenderAddress=facade.network.publicKeyToAddress(senderKeyPair.publicKey);constrecipientPrivateKeyString=process.env.RECIPIENT_PRIVATE_KEY||'1111111111111111111111111111111111111111111111111111111111111111';constrecipientKeyPair=newSymbolFacade.KeyPair(newPrivateKey(recipientPrivateKeyString));constrecipientAddress=facade.network.publicKeyToAddress(recipientKeyPair.publicKey);console.log('Sender address:',senderAddress.toString());console.log('Recipient address:',recipientAddress.toString(),'\n');
// Set up sender and recipient accountsfinalStringsenderPrivateKeyString=System.getenv().getOrDefault("SENDER_PRIVATE_KEY","0".repeat(64));finalKeyPairsenderKeyPair=newKeyPair(newCryptoTypes.PrivateKey(senderPrivateKeyString));finalAddresssenderAddress=facade.network.publicKeyToAddress(senderKeyPair.getPublicKey());finalStringrecipientPrivateKeyString=System.getenv().getOrDefault("RECIPIENT_PRIVATE_KEY","1".repeat(64));finalKeyPairrecipientKeyPair=newKeyPair(newCryptoTypes.PrivateKey(recipientPrivateKeyString));finalAddressrecipientAddress=facade.network.publicKeyToAddress(recipientKeyPair.getPublicKey());System.out.printf("Sender address: %s%n",senderAddress);System.out.printf("Recipient address: %s%n%n",recipientAddress);
print("==> Sending Plain Text Message")# Create a plain text messageplain_message="Hello, Symbol!".encode("utf-8")print(f"Plain message: {plain_message.decode('utf-8')}")# Build transfer transaction with plain messageplain_transaction=facade.create_transaction_from_descriptor({"type":"transfer_transaction_v1","recipient_address":recipient_address,"mosaics":[],"message":plain_message,},sender_key_pair.public_key,fee_multiplier,2*60*60)
console.log('==> Sending Plain Text Message');// Create a plain text messageconstplainMessage=newTextEncoder().encode('Hello, Symbol!');console.log('Plain message:',newTextDecoder().decode(plainMessage));// Build transfer transaction with plain messageconstplainTransaction=facade.createTransactionFromTypedDescriptor(newdescriptors.TransferTransactionV1Descriptor(recipientAddress,[],plainMessage),senderKeyPair.publicKey,feeMultiplier,2*60*60);
System.out.println("==> Sending Plain Text Message");// Create a plain text messagefinalbyte[]plainMessage="Hello, Symbol!".getBytes(StandardCharsets.UTF_8);System.out.printf("Plain message: %s%n",newString(plainMessage,StandardCharsets.UTF_8));// Build transfer transaction with plain messagefinalTransactionplainTransaction=facade.createTransactionFromTypedDescriptor(newTransferTransactionV1Descriptor(recipientAddress,null,plainMessage),senderKeyPair.getPublicKey(),feeMultiplier,2*60*60);
print("==> Sending Encrypted Message")# Create a message encoder with sender's key pairsender_message_encoder=MessageEncoder(sender_key_pair)# Encrypt the message using recipient's public keysecret_message="This is a secret message!".encode("utf-8")encrypted_payload=sender_message_encoder.encode(recipient_key_pair.public_key,secret_message)print(f"Original message: {secret_message.decode('utf-8')}")print(f"Encrypted payload: {hexlify(encrypted_payload).decode("utf-8")}")# Build transfer transaction with encrypted messageencrypted_transaction=facade.create_transaction_from_descriptor({"type":"transfer_transaction_v1","recipient_address":recipient_address,"mosaics":[],"message":encrypted_payload,},sender_key_pair.public_key,fee_multiplier,2*60*60)
console.log('==> Sending Encrypted Message');// Create a message encoder with sender's key pairconstsenderMessageEncoder=newMessageEncoder(senderKeyPair);// Encrypt the message using recipient's public keyconstsecretMessage=newTextEncoder().encode('This is a secret message!');constencryptedPayload=senderMessageEncoder.encode(recipientKeyPair.publicKey,secretMessage);console.log('Original message:',newTextDecoder().decode(secretMessage));console.log('Encrypted payload:',Buffer.from(encryptedPayload).toString('hex'));// Build transfer transaction with encrypted messageconstencryptedTransaction=facade.createTransactionFromTypedDescriptor(newdescriptors.TransferTransactionV1Descriptor(recipientAddress,[],encryptedPayload),senderKeyPair.publicKey,feeMultiplier,2*60*60);
System.out.println("==> Sending Encrypted Message");// Create a message encoder with sender's key pairfinalMessageEncodersenderMessageEncoder=newMessageEncoder(senderKeyPair);// Encrypt the message using recipient's public keyfinalbyte[]secretMessage="This is a secret message!".getBytes(StandardCharsets.UTF_8);finalbyte[]encryptedPayload=senderMessageEncoder.encode(recipientKeyPair.getPublicKey(),secretMessage);System.out.printf("Original message: %s%n",newString(secretMessage,StandardCharsets.UTF_8));System.out.printf("Encrypted payload: %s%n",HexFormat.of().formatHex(encryptedPayload));// Build transfer transaction with encrypted messagefinalTransactionencryptedTransaction=facade.createTransactionFromTypedDescriptor(newTransferTransactionV1Descriptor(recipientAddress,null,encryptedPayload),senderKeyPair.getPublicKey(),feeMultiplier,2*60*60);
print("<== Receiving Encrypted Message")# Wait for confirmationencrypted_tx_data=retrieve_confirmed_transaction(encrypted_transaction_hash,"Encrypted message transaction")# Decode encrypted message using recipient's private keyrecipient_message_encoder=MessageEncoder(recipient_key_pair)received_encrypted_message=bytes.fromhex(encrypted_tx_data["transaction"]["message"])# Get sender's public key from the transactionsender_public_key_from_tx=PublicKey(encrypted_tx_data["transaction"]["signerPublicKey"])(is_decoded,decrypted_message)=recipient_message_encoder.try_decode(sender_public_key_from_tx,received_encrypted_message)ifis_decoded:message_text=decrypted_message.decode("utf-8")print(f"Recipient decrypted message: {message_text}")else:print("Recipient failed to decrypt message")
console.log('<== Receiving Encrypted Message');// Wait for confirmationconstencryptedTxData=awaitretrieveConfirmedTransaction(encryptedTransactionHash,'Encrypted message transaction');// Decode encrypted message using recipient's private keyconstrecipientMessageEncoder=newMessageEncoder(recipientKeyPair);constreceivedEncryptedMessage=Buffer.from(encryptedTxData.transaction.message,'hex');// Get sender's public key from the transactionconstsenderPublicKeyFromTx=newPublicKey(encryptedTxData.transaction.signerPublicKey);constresult=recipientMessageEncoder.tryDecode(senderPublicKeyFromTx,receivedEncryptedMessage);if(result.isDecoded){console.log('Recipient decrypted message:',newTextDecoder().decode(result.message));}else{console.log('Recipient failed to decrypt message');}
System.out.println("<== Receiving Encrypted Message");// Wait for confirmationfinalJsonNodeencryptedTxData=retrieveConfirmedTransaction(encryptedTransactionHash,"Encrypted message transaction");// Decode encrypted message using recipient's private keyfinalMessageEncoderrecipientMessageEncoder=newMessageEncoder(recipientKeyPair);finalbyte[]receivedEncryptedMessage=HexFormat.of().parseHex(encryptedTxData.get("transaction").get("message").asText());// Get sender's public key from the transactionfinalCryptoTypes.PublicKeysenderPublicKeyFromTx=newCryptoTypes.PublicKey(encryptedTxData.get("transaction").get("signerPublicKey").asText());finalMessageEncoderResultresult=recipientMessageEncoder.tryDecode(senderPublicKeyFromTx,receivedEncryptedMessage);if(result.isDecoded()){System.out.printf("Recipient decrypted message: %s%n",newString((byte[])result.message(),StandardCharsets.UTF_8));}else{System.out.println("Recipient failed to decrypt message");}