Inviare transazioni usando il Web3
Questa è una guida per principianti su come inviare transazioni Ethereum usando il Web3. Ci sono tre passaggi principali per inviare una transazione alla blockchain di Ethereum: creazione, firma e trasmissione. Li esamineremo tutti e tre, sperando di rispondere a qualsiasi domanda tu possa avere! In questo tutorial, useremo Alchemy (opens in a new tab) per inviare le nostre transazioni alla catena di Ethereum. Puoi creare un account Alchemy gratuito qui (opens in a new tab).
NOTA: Questa guida riguarda la firma delle tue transazioni sul backend per la tua app. Se vuoi integrare la firma delle tue transazioni sul frontend, dai un'occhiata all'integrazione del Web3 con un provider del browser (opens in a new tab).
Le basi
Come la maggior parte degli sviluppatori blockchain agli inizi, potresti aver fatto delle ricerche su come inviare una transazione (qualcosa che dovrebbe essere piuttosto semplice) e ti sei imbattuto in una pletora di guide, ognuna delle quali dice cose diverse lasciandoti un po' sopraffatto e confuso. Se ti trovi in questa situazione, non preoccuparti; ci siamo passati tutti a un certo punto! Quindi, prima di iniziare, chiariamo alcune cose:
1. Alchemy non memorizza le tue chiavi private
- Questo significa che Alchemy non può firmare e inviare transazioni per tuo conto. Il motivo è legato alla sicurezza. Alchemy non ti chiederà mai di condividere la tua chiave privata, e non dovresti mai condividere la tua chiave privata con un nodo ospitato (o con chiunque altro, se è per questo).
- Puoi leggere dalla blockchain usando l'API principale di Alchemy, ma per scriverci dovrai usare qualcos'altro per firmare le tue transazioni prima di inviarle tramite Alchemy (questo vale per qualsiasi altro servizio di nodo).
2. Cos'è un "signer"?
- I signer ("firmatari") firmeranno le transazioni per tuo conto usando la tua chiave privata. In questo tutorial useremo Alchemy Web3 (opens in a new tab) per firmare la nostra transazione, ma potresti anche usare qualsiasi altra libreria Web3.
- Sul frontend, un buon esempio di signer è MetaMask (opens in a new tab), che firmerà e invierà le transazioni per tuo conto.
3. Perché devo firmare le mie transazioni?
- Ogni utente che vuole inviare una transazione sulla rete Ethereum deve firmare la transazione (usando la propria chiave privata), al fine di convalidare che l'origine della transazione sia chi afferma di essere.
- È importantissimo proteggere questa chiave privata, poiché avervi accesso garantisce il pieno controllo sul tuo account Ethereum, consentendo a te (o a chiunque vi abbia accesso) di eseguire transazioni per tuo conto.
4. Come proteggo la mia chiave privata?
- Ci sono molti modi per proteggere la tua chiave privata e usarla per inviare transazioni. In questo tutorial useremo un file
.env. Tuttavia, potresti anche usare un provider separato che memorizza le chiavi private, usare un file keystore o altre opzioni.
5. Qual è la differenza tra eth_sendTransaction e eth_sendRawTransaction?
eth_sendTransaction e eth_sendRawTransaction sono entrambe funzioni dell'API di Ethereum che trasmettono una transazione alla rete Ethereum in modo che venga aggiunta a un blocco futuro. Differiscono nel modo in cui gestiscono la firma delle transazioni.
eth_sendTransaction(opens in a new tab) è usato per inviare transazioni non firmate, il che significa che il nodo a cui stai inviando deve gestire la tua chiave privata in modo da poter firmare la transazione prima di trasmetterla alla catena. Poiché Alchemy non detiene le chiavi private degli utenti, non supporta questo metodo.eth_sendRawTransaction(opens in a new tab) è usato per trasmettere transazioni che sono già state firmate. Questo significa che devi prima usaresignTransaction(tx, private_key)(opens in a new tab), quindi passare il risultato ineth_sendRawTransaction.
Quando si usa il Web3, si accede a eth_sendRawTransaction chiamando la funzione web3.eth.sendSignedTransaction (opens in a new tab).
Questo è ciò che useremo in questo tutorial.
6. Cos'è la libreria Web3?
- Web3.js è una libreria wrapper attorno alle chiamate JSON-RPC standard che è piuttosto comune usare nello sviluppo su Ethereum.
- Ci sono molte librerie Web3 per diversi linguaggi. In questo tutorial useremo Alchemy Web3 (opens in a new tab) che è scritta in JavaScript. Puoi dare un'occhiata ad altre opzioni qui come Ethers.js (opens in a new tab).
Ok, ora che abbiamo chiarito alcune di queste domande, passiamo al tutorial. Sentiti libero di fare domande in qualsiasi momento nel Discord (opens in a new tab) di Alchemy!
7. Come inviare transazioni sicure, ottimizzate per il gas e private?
- Alchemy ha una serie di risorse per le transazioni (opens in a new tab). Puoi usarle per inviare transazioni, simulare transazioni prima che avvengano, inviare transazioni private e inviare transazioni ottimizzate per il gas.
- Puoi anche usare i webhook di Alchemy (opens in a new tab) per ricevere un avviso quando la tua transazione viene prelevata dalla mempool e aggiunta alla catena.
NOTA: Questa guida richiede un account Alchemy, un indirizzo Ethereum o un portafoglio MetaMask, Node.js e npm installati. In caso contrario, segui questi passaggi:
- Crea un account Alchemy gratuito (opens in a new tab)
- Crea un account MetaMask (opens in a new tab) (o ottieni un indirizzo Ethereum)
- Installa Node.js e npm (opens in a new tab)
Passaggi per inviare la tua transazione
1. Crea un'app Alchemy sulla testnet Sepolia
Vai alla tua Dashboard di Alchemy (opens in a new tab) e crea una nuova app, scegliendo Sepolia (o qualsiasi altra testnet) per la tua rete.
2. Richiedi ETH dal faucet di Sepolia
Segui le istruzioni sul faucet di Sepolia di Alchemy (opens in a new tab) per ricevere ETH. Assicurati di includere il tuo indirizzo Ethereum di Sepolia (da MetaMask) e non di un'altra rete. Dopo aver seguito le istruzioni, ricontrolla di aver ricevuto gli ETH nel tuo portafoglio.
3. Crea una nuova directory di progetto ed entraci con cd
Crea una nuova directory di progetto dalla riga di comando (terminale per Mac) e naviga al suo interno:
mkdir sendtx-example
cd sendtx-example
4. Installa Alchemy Web3 (o qualsiasi libreria Web3)
Esegui il seguente comando nella tua directory di progetto per installare Alchemy Web3 (opens in a new tab):
Nota: se desideri usare la libreria Ethers.js, segui le istruzioni qui (opens in a new tab).
npm install @alch/alchemy-web3
5. Installa dotenv
Useremo un file .env per memorizzare in modo sicuro la nostra chiave API e la chiave privata.
npm install dotenv --save
6. Crea il file .env
Crea un file .env nella tua directory di progetto e aggiungi quanto segue (sostituendo "your-api-url" e "your-private-key")
- Per trovare l'URL della tua API di Alchemy, vai alla pagina dei dettagli dell'app che hai appena creato sulla tua dashboard, clicca su "View Key" nell'angolo in alto a destra e prendi l'URL HTTP.
- Per trovare la tua chiave privata usando MetaMask, dai un'occhiata a questa guida (opens in a new tab).
API_URL = "your-api-url"
PRIVATE_KEY = "your-private-key"
.env! Assicurati di non condividere o esporre mai il tuo file .env a nessuno, poiché così facendo comprometteresti i tuoi segreti. Se stai usando il controllo di versione, aggiungi il tuo .env a un file gitignore.7. Crea il file sendTx.js
Ottimo, ora che abbiamo protetto i nostri dati sensibili in un file .env, iniziamo a programmare. Per il nostro esempio di invio di una transazione, restituiremo ETH al faucet di Sepolia.
Crea un file sendTx.js, dove configureremo e invieremo la nostra transazione di esempio, e aggiungi le seguenti righe di codice:
async function main() {
require('dotenv').config();
const { API_URL, PRIVATE_KEY } = process.env;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(API_URL);
const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' // DA FARE: sostituisci questo indirizzo con il tuo indirizzo pubblico
const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // il conteggio del nonce inizia da 0
const transaction = {
'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // indirizzo del faucet per restituire gli eth
'value': 1000000000000000000, // 1 ETH
'gas': 30000,
'nonce': nonce,
// campo data facoltativo per inviare un messaggio o eseguire uno smart contract
};
const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
if (!error) {
console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
} else {
console.log("❗Something went wrong while submitting your transaction:", error)
}
});
}
main();
Assicurati di sostituire l'indirizzo alla riga 6 con il tuo indirizzo pubblico.
Ora, prima di passare all'esecuzione di questo codice, parliamo di alcuni dei componenti qui presenti.
nonce: la specifica del nonce viene utilizzata per tenere traccia del numero di transazioni inviate dal tuo indirizzo. Ne abbiamo bisogno per motivi di sicurezza e per prevenire attacchi di replay. Per ottenere il numero di transazioni inviate dal tuo indirizzo, usiamo getTransactionCount (opens in a new tab).transaction: l'oggetto della transazione ha alcuni aspetti che dobbiamo specificare.to: questo è l'indirizzo a cui vogliamo inviare gli ETH. In questo caso, stiamo restituendo gli ETH al faucet di Sepolia (opens in a new tab) a cui li abbiamo inizialmente richiesti.value: questo è l'importo che desideriamo inviare, specificato in Wei, dove 10^18 Wei = 1 ETH.gas: ci sono molti modi per determinare la giusta quantità di gas da includere nella tua transazione. Alchemy supporta i webhook (opens in a new tab) che possono avvisarti sulle attività onchain. Per le transazioni sulla Mainnet, è buona norma controllare le condizioni attuali del gas per determinare la giusta quantità di gas da includere. 21000 è la quantità minima di gas che un'operazione su Ethereum utilizzerà, quindi per assicurarci che la nostra transazione venga eseguita inseriamo qui 30000.nonce: vedi la definizione di nonce sopra. Il conteggio del nonce inizia da zero.- data [FACOLTATIVO]: utilizzato per inviare informazioni aggiuntive con il tuo trasferimento o per chiamare uno smart contract, non è richiesto per i trasferimenti di saldo, dai un'occhiata alla nota di seguito.
signedTx: per firmare il nostro oggetto transazione useremo il metodosignTransactioncon la nostraPRIVATE_KEY.sendSignedTransaction: una volta che abbiamo una transazione firmata, possiamo inviarla affinché venga inclusa in un blocco successivo utilizzandosendSignedTransaction.
Una nota su data Ci sono due tipi principali di transazioni che possono essere inviate su Ethereum.
- Trasferimento di saldo: invia ETH da un indirizzo a un altro. Non è richiesto alcun campo
data, tuttavia, se desideri inviare informazioni aggiuntive insieme alla tua transazione, puoi includere tali informazioni in formato esadecimale in questo campo.- Ad esempio, supponiamo di voler scrivere l'hash di un documento IPFS sulla catena di Ethereum per dargli una marca temporale immutabile. Il nostro campo
datadovrebbe quindi apparire comedata: web3.utils.toHex(‘hash IPFS‘). E ora chiunque può interrogare la catena e vedere quando quel documento è stato aggiunto.
- Ad esempio, supponiamo di voler scrivere l'hash di un documento IPFS sulla catena di Ethereum per dargli una marca temporale immutabile. Il nostro campo
- Transazione di smart contract: esegue del codice di smart contract sulla catena. In questo caso, il campo
datadovrebbe contenere la funzione dello smart contract che desideri eseguire, insieme a eventuali parametri.- Per un esempio pratico, dai un'occhiata al tutorial per lo smart contract Hello World.
8. Esegui il codice usando node sendTx.js
Torna al tuo terminale o riga di comando ed esegui:
node sendTx.js
9. Vedi la tua transazione nella mempool
Apri la pagina Mempool (opens in a new tab) nella tua dashboard di Alchemy e filtra in base all'app che hai creato per trovare la tua transazione. È qui che possiamo osservare il passaggio della nostra transazione dallo stato in sospeso (pending) allo stato minato (mined) (se ha esito positivo) o allo stato abbandonato (dropped) se non ha esito positivo. Assicurati di mantenerlo su "All" (Tutte) in modo da catturare le transazioni "mined", "pending" e "dropped". Puoi anche cercare la tua transazione cercando le transazioni inviate all'indirizzo 0x31b98d14007bdee637298086988a0bbd31184523.
Per visualizzare i dettagli della tua transazione una volta trovata, seleziona l'hash della transazione; questo dovrebbe portarti a una visualizzazione simile a questa:
Da lì puoi visualizzare la tua transazione su Etherscan cliccando sull'icona cerchiata in rosso!
Evviva! Hai appena inviato la tua prima transazione Ethereum usando Alchemy 🎉
Per feedback e suggerimenti su questa guida, invia un messaggio a Elan sul Discord (opens in a new tab) di Alchemy!
Pubblicato originariamente da Alchemy.
