Přejít na hlavní obsah

Odesílání transakcí pomocí Viem

transakce
Viem
Alchemy
Začátečník
Elan Halpern
4. listopadu 2020
10 minut čtení

Toto je průvodce pro začátečníky, jak odesílat transakce na Ethereu pomocí knihovny Viem (otevře se v nové záložce). K odeslání transakce na blockchain Etherea vedou tři hlavní kroky: vytvoření, podepsání a odeslání. Projdeme si všechny tři a doufejme, že zodpovíme všechny vaše případné dotazy! V tomto tutoriálu budeme používat Alchemy (otevře se v nové záložce) k odesílání našich transakcí do řetězce Etherea. Zde si můžete vytvořit bezplatný účet Alchemy (otevře se v nové záložce).

POZNÁMKA: Tento průvodce je určen pro podepisování vašich transakcí na backendu vaší aplikace. Pokud chcete integrovat podepisování transakcí na frontendu, podívejte se na API poskytovatele MetaMask (otevře se v nové záložce).

Základy

Stejně jako většina blockchainových vývojářů ve svých začátcích jste si možná zjišťovali, jak odeslat transakci (což by mělo být docela jednoduché), a narazili jste na nepřeberné množství návodů, z nichž každý říkal něco jiného, což vás trochu zahltilo a zmátlo. Pokud jste na tom podobně, nebojte se; všichni jsme tam někdy byli! Než tedy začneme, ujasněme si několik věcí:

1. Alchemy neukládá vaše soukromé klíče

  • To znamená, že Alchemy nemůže podepisovat a odesílat transakce vaším jménem. Důvodem je bezpečnost. Alchemy vás nikdy nepožádá o sdílení vašeho soukromého klíče a vy byste nikdy neměli sdílet svůj soukromý klíč s hostovaným uzlem (ani s nikým jiným).
  • Z blockchainu můžete číst pomocí základního API Alchemy, ale pro zápis do něj budete muset použít něco jiného k podepsání vašich transakcí před jejich odesláním přes Alchemy (to platí i pro jakoukoli jinou službu uzlu).

2. Co je to „signer“ (podepisovatel)?

  • Signeři za vás podepisují transakce pomocí vašeho soukromého klíče. V tomto tutoriálu budeme k podepsání naší transakce používat Viem (otevře se v nové záložce), ale můžete použít i jakoukoli jinou knihovnu Web3.
  • Na frontendu by byl dobrým příkladem signera MetaMask (otevře se v nové záložce), který bude podepisovat a odesílat transakce vaším jménem.

3. Proč musím podepisovat své transakce?

  • Každý uživatel, který chce odeslat transakci v síti Ethereum, musí transakci podepsat (pomocí svého soukromého klíče), aby se ověřilo, že původce transakce je skutečně ten, za koho se vydává.
  • Je nesmírně důležité tento soukromý klíč chránit, protože přístup k němu poskytuje plnou kontrolu nad vaším účtem na Ethereu a umožňuje vám (nebo komukoli s přístupem) provádět transakce vaším jménem.

4. Jak ochráním svůj soukromý klíč?

  • Existuje mnoho způsobů, jak chránit svůj soukromý klíč a používat jej k odesílání transakcí. V tomto tutoriálu budeme používat soubor .env. Můžete však také použít samostatného poskytovatele, který ukládá soukromé klíče, použít soubor úložiště klíčů (keystore) nebo jiné možnosti.

5. Jaký je rozdíl mezi eth_sendTransaction a eth_sendRawTransaction?

eth_sendTransaction a eth_sendRawTransaction jsou obě funkce API Etherea, které odesílají transakci do sítě Etherea, aby byla přidána do budoucího bloku. Liší se v tom, jak zacházejí s podepisováním transakcí.

Při použití Viem se k eth_sendRawTransaction přistupuje voláním funkce sendRawTransaction (otevře se v nové záložce).

To je to, co budeme používat v tomto tutoriálu.

6. Co je to knihovna Web3?

Dobře, teď, když máme několik z těchto otázek z krku, přejděme k tutoriálu. Neváhejte se kdykoli zeptat na Discordu (otevře se v nové záložce) Alchemy!

7. Jak odesílat bezpečné, soukromé transakce s optimalizovaným gasem?

POZNÁMKA: Tento průvodce vyžaduje účet Alchemy, adresu na Ethereu nebo peněženku MetaMask a nainstalované Node.js a npm. Pokud je nemáte, postupujte podle těchto kroků:

  1. Vytvořte si bezplatný účet Alchemy (otevře se v nové záložce)
  2. Vytvořte si účet MetaMask (otevře se v nové záložce) (nebo získejte adresu na Ethereu)
  3. Nainstalujte Node.js a npm (otevře se v nové záložce)

Kroky k odeslání vaší transakce

1. Vytvořte aplikaci Alchemy na testnetu Sepolia

Přejděte na svůj řídicí panel Alchemy (otevře se v nové záložce) a vytvořte novou aplikaci, přičemž jako síť zvolte Sepolia (nebo jakýkoli jiný testnet).

2. Vyžádejte si ETH z faucetu Sepolia

Postupujte podle pokynů na faucetu Alchemy Sepolia (otevře se v nové záložce), abyste získali ETH, nebo použijte jeden z dalších faucetů Sepolia. Faucety rozdávají malé částky (faucet Alchemy dává 0,1 ETH denně), což je pro tento tutoriál více než dost. Ujistěte se, že jste zadali svou adresu na Ethereu pro síť Sepolia (z MetaMasku) a ne pro jinou síť. Po provedení pokynů si dvakrát zkontrolujte, zda jste ETH do své peněženky obdrželi.

3. Vytvořte nový adresář projektu a přejděte do něj pomocí cd

Vytvořte nový adresář projektu z příkazového řádku (terminálu na Macu) a přejděte do něj:

mkdir sendtx-example
cd sendtx-example

4. Nainstalujte Viem (nebo jakoukoli knihovnu Web3)

Spusťte následující příkaz v adresáři vašeho projektu pro instalaci Viem (otevře se v nové záložce):

Poznámka: Pokud byste chtěli použít knihovnu Ethers.js, postupujte podle pokynů zde (otevře se v nové záložce).

npm init -y
npm install viem

5. Nainstalujte dotenv

K bezpečnému uložení našeho klíče API a soukromého klíče použijeme soubor .env.

npm install dotenv

6. Vytvořte soubor .env

Vytvořte soubor .env v adresáři vašeho projektu a přidejte následující (nahraďte „your-api-url“ a „your-private-key“)

  • Chcete-li najít svou URL adresu API Alchemy, přejděte na stránku s podrobnostmi o aplikaci, kterou jste právě vytvořili na svém řídicím panelu, klikněte na „View Key“ v pravém horním rohu a zkopírujte HTTP URL.
  • Chcete-li najít svůj soukromý klíč pomocí MetaMasku, podívejte se na tohoto průvodce (otevře se v nové záložce). Použijte účet, který obsahuje pouze testnet ETH.
API_URL="your-api-url"
PRIVATE_KEY="your-private-key"
Necommitujte .env! Ujistěte se, že svůj soubor .env nikdy s nikým nesdílíte ani ho nevystavujete, protože tím ohrožujete svá tajemství. Pokud používáte správu verzí, přidejte svůj .env do souboru gitignore.

7. Vytvořte soubor sendTx.js

Skvělé, teď, když máme naše citlivá data chráněna v souboru .env, začněme programovat. Pro náš příklad odeslání transakce budeme posílat 0,001 ETH na jinou adresu, kterou ovládáte, například na druhý účet v MetaMasku.

Vytvořte soubor sendTx.js, ve kterém nakonfigurujeme a odešleme naši ukázkovou transakci, a přidejte do něj následující řádky kódu:

Nezapomeňte nahradit 0xYourSecondAddress adresou, na kterou chcete ETH odeslat. Skript odvodí vaši vlastní (odesílací) adresu z PRIVATE_KEY, takže ji nemusíte zadávat.

Než se pustíme do spuštění tohoto kódu, pojďme si promluvit o některých jeho součástech.

  • account: Místní účet vytvořený z vašeho soukromého klíče pomocí privateKeyToAccount (otevře se v nové záložce). Podepisování probíhá na vašem počítači a soukromý klíč se nikdy neodesílá do Alchemy.
  • publicClient a walletClient: Klienti Viem, kteří odesílají požadavky JSON-RPC na vaši URL adresu Alchemy. Veřejný klient (public client) čte z řetězce a klient peněženky (wallet client) připravuje a podepisuje transakce pro váš účet.
  • nonce: Specifikace nonce se používá ke sledování počtu transakcí odeslaných z vaší adresy. Potřebujeme to z bezpečnostních důvodů a k zabránění útokům typu replay. K získání počtu transakcí odeslaných z vaší adresy používáme getTransactionCount (otevře se v nové záložce). Viem by to za vás také vyplnil, ale my to zde explicitně načítáme, abychom ukázali, odkud to pochází.
  • transaction: Objekt transakce má několik aspektů, které musíme specifikovat. prepareTransactionRequest (otevře se v nové záložce) za nás vyplní zbytek, včetně chainId a polí poplatků EIP-1559 maxFeePerGas a maxPriorityFeePerGas, na základě aktuálních podmínek v síti.
    • to: Toto je adresa, na kterou chceme odeslat ETH.
    • value: Toto je částka, kterou chceme odeslat, specifikovaná ve Wei, kde 10^18 Wei = 1 ETH. parseEther (otevře se v nové záložce) za nás převede částku v ETH na Wei. Váš účet potřebuje o něco více než toto, protože platí také za gas.
    • gas: Existuje mnoho způsobů, jak určit správné množství gasu, které se má zahrnout do vaší transakce. Alchemy podporuje webhooky (otevře se v nové záložce), které vás mohou upozornit na onchain aktivitu. U transakcí na Mainnetu je dobrým zvykem zkontrolovat aktuální podmínky gasu, abyste určili správné množství gasu, které se má zahrnout. Obyčejný převod ETH na běžnou adresu vždy spotřebuje přesně 21 000 gasu, což je minimum pro jakoukoli transakci, takže sem zadáme 21000. Pokud gas vynecháte, Viem jej za vás odhadne.
    • nonce: viz definice nonce výše. Nonce se začíná počítat od nuly.
    • [VOLITELNÉ] data: Používá se k odeslání dalších informací s vaším převodem nebo k volání chytrého kontraktu, není vyžadováno pro převody zůstatku, podívejte se na poznámku níže.
  • signedTx: K podepsání našeho objektu transakce použijeme metodu signTransaction, která jej lokálně podepíše pomocí účtu vytvořeného z našeho PRIVATE_KEY.
  • sendRawTransaction: Jakmile máme podepsanou transakci, můžeme ji odeslat k zahrnutí do následujícího bloku pomocí sendRawTransaction, což volá eth_sendRawTransaction.
  • waitForTransactionReceipt: Čeká, dokud není transakce zahrnuta do bloku, a vrátí její stvrzenku.

Poznámka k datům (data) V Ethereu lze odeslat dva hlavní typy transakcí.

  • Převod zůstatku: Odeslání ETH z jedné adresy na druhou. Není vyžadováno žádné datové pole, nicméně pokud byste chtěli spolu s transakcí odeslat další informace, můžete tyto informace zahrnout do tohoto pole ve formátu HEX.
    • Řekněme například, že bychom chtěli zapsat hash dokumentu IPFS do řetězce Etherea, abychom mu dali neměnný časový údaj. Naše datové pole by pak mělo vypadat jako data: toHex("IPFS hash"), s použitím toHex (otevře se v nové záložce) z knihovny Viem. A nyní může kdokoli dotazovat řetězec a zjistit, kdy byl tento dokument přidán.
  • Transakce chytrého kontraktu: Spuštění nějakého kódu chytrého kontraktu v řetězci. V tomto případě by datové pole mělo obsahovat chytrou funkci, kterou chcete spustit, spolu s případnými parametry.

8. Spusťte kód pomocí node sendTx.js

Přejděte zpět do terminálu nebo příkazového řádku a spusťte:

node sendTx.js

9. Prohlédněte si svou transakci v prohlížeči bloků

Skript vypíše hash transakce, jakmile uzel transakci přijme, poté počká, dokud nebude zahrnuta do bloku (obvykle během několika sekund), a vypíše výsledek. Chcete-li zobrazit podrobnosti, vložte hash do prohlížeče bloků Sepolia, jako je Sepolia Etherscan (otevře se v nové záložce) nebo Blockscout (otevře se v nové záložce). Tam můžete sledovat, jak transakce přechází ze stavu čekající (pending) do stavu zahrnutá (included), a vidět částku, poplatky a blok, ve kterém skončila.

Pokud místo toho uvidíte chybu insufficient funds (nedostatek prostředků), váš účet nemá dostatek Sepolia ETH na pokrytí hodnoty plus gasu. Vraťte se ke kroku 2 a vyžádejte si více z faucetu.

Jupííí! Právě jste odeslali svou první transakci na Ethereu pomocí Alchemy 🎉

Pro zpětnou vazbu a návrhy k tomuto průvodci prosím napište Elanovi na Discordu (otevře se v nové záložce) Alchemy!

Původně publikováno společností Alchemy.