Volání chytrého kontraktu z JavaScriptu
V tomto návodu si ukážeme, jak zavolat funkci chytrého kontraktu z JavaScriptu. Nejprve si přečteme stav chytrého kontraktu (např. zůstatek držitele ERC20), poté změníme stav blockchainu provedením převodu tokenu. Měli byste již být obeznámeni s nastavením prostředí JS pro interakci s blockchainem.
V tomto příkladu budeme pracovat s tokenem DAI. Pro účely testování vytvoříme větev blockchainu pomocí ganache-cli a odemkneme adresu, která již má hodně DAI:
ganache-cli -f https://mainnet.infura.io/v3/[VÁŠ INFURA KLÍČ] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81Pro interakci s chytrým kontraktem budeme potřebovat jeho adresu a ABI:
1const ERC20TransferABI = [2 {3 constant: false,4 inputs: [5 {6 name: "_to",7 type: "address",8 },9 {10 name: "_value",11 type: "uint256",12 },13 ],14 name: "transfer",15 outputs: [16 {17 name: "",18 type: "bool",19 },20 ],21 payable: false,22 stateMutability: "nonpayable",23 type: "function",24 },25 {26 constant: true,27 inputs: [28 {29 name: "_owner",30 type: "address",31 },32 ],33 name: "balanceOf",34 outputs: [35 {36 name: "balance",37 type: "uint256",38 },39 ],40 payable: false,41 stateMutability: "view",42 type: "function",43 },44]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Zobrazit všePro tento projekt jsme z kompletního ERC20 ABI ponechali pouze funkce balanceOf a transfer, ale celé ERC20 ABI naleznete zde (opens in a new tab).
Poté musíme náš chytrý kontrakt instanciovat:
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)Také si nastavíme dvě adresy:
- tu, která obdrží převod, a
- tu, kterou jsme již odemkli a která ho odešle:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"V další části zavoláme funkci balanceOf, abychom zjistili aktuální množství tokenů, které obě adresy drží.
Volání: Čtení hodnoty z chytrého kontraktu
První příklad zavolá „konstantní“ metodu a spustí metodu chytrého kontraktu v EVM bez odeslání jakékoli transakce. Za tímto účelem si přečteme zůstatek ERC20 na adrese. Přečtěte si náš článek o ERC20 tokenech.
K metodám instanciovaného chytrého kontraktu, pro který jste poskytli ABI, můžete přistupovat následovně: yourContract.methods.methodname. Použitím funkce call obdržíte výsledek jejího spuštění.
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("Došlo k chybě", err)4 return5 }6 console.log("Zůstatek je: ", res)7})Pamatujte, že DAI ERC20 má 18 desetinných míst, což znamená, že pro získání správné částky musíte odstranit 18 nul. Hodnoty uint256 se vrací jako řetězce, protože JavaScript nezvládá velká číselné hodnoty. Pokud si nejste jisti, jak zacházet s velkými čísly v JS, podívejte se na náš návod o bignumber.js (opens in a new tab).
Odeslání: Odeslání transakce do funkce chytrého kontraktu
Ve druhém příkladu zavoláme funkci transfer chytrého kontraktu DAI, abychom odeslali 10 DAI na naši druhou adresu. Funkce transfer přijímá dva parametry: adresu příjemce a množství tokenů k převodu:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("Došlo k chybě", err)6 return7 }8 console.log("Haš transakce: " + res)9 })Zobrazit všeVolání funkce vrátí haš transakce, která bude vytěžena v blockchainu. Na Ethereu jsou haše transakcí předvídatelné - tak můžeme získat haš transakce ještě před jejím spuštěním (zde se dozvíte, jak se haše počítají (opens in a new tab)).
Protože funkce pouze odešle transakci do blockchainu, neuvidíme výsledek, dokud nebudeme vědět, kdy bude vytěžena a zahrnuta do blockchainu. V příštím návodu se dozvíme, jak počkat na provedení transakce na blockchainu, když známe její haš (opens in a new tab).
Stránka naposledy aktualizována: 21. října 2025