Mengirim Transaksi
Menulis ke chain
Mengirim Transaksi adalah pelajaran Web3 & DApp Development Fundamentals gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Web3 & DApp Development Fundamentals, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Web3 & DApp Development Fundamentals mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
Writing to the Chain
Changing contract state — transferring tokens, minting, voting — requires a transaction. Transactions must be signed and cost gas.
For this you need a signer, not just a provider.
A Contract with a Signer
To send transactions, create the contract with a signer or connect an existing instance to one:
const contract = new ethers.Contract(
address,
abi,
signer
);
// or
const writable = readOnly.connect(signer);Now state-changing functions become available.
const contract = new ethers.Contract(
address,
abi,
signer
);
// or
const writable = readOnly.connect(signer);Sending a Transaction
Calling a write function sends a transaction and returns a transaction response immediately — before it is mined:
const tx = await contract.transfer(
recipient,
ethers.parseUnits("10", 18)
);
console.log("Sent:", tx.hash);The hash identifies the pending transaction.
const tx = await contract.transfer(
recipient,
ethers.parseUnits("10", 18)
);
console.log("Sent:", tx.hash);Waiting for Confirmation
The transaction is not final until it is mined. Wait for the receipt:
const receipt = await tx.wait();
console.log("Mined in block:", receipt.blockNumber);
console.log("Status:", receipt.status);A status of 1 means success; 0 means it reverted.
const receipt = await tx.wait();
console.log("Mined in block:", receipt.blockNumber);
console.log("Status:", receipt.status);Waiting for More Blocks
For higher confidence against reorgs, wait for several confirmations:
// Wait for 3 confirmations
const receipt = await tx.wait(3);More confirmations mean it is increasingly unlikely the transaction will be reversed.
// Wait for 3 confirmations
const receipt = await tx.wait(3);Sending ETH with a Call
Payable functions accept ETH. Pass a value override as the last argument:
const tx = await contract.deposit({
value: ethers.parseEther("0.5"),
});
await tx.wait();The value is in wei; parseEther converts from a human amount.
const tx = await contract.deposit({
value: ethers.parseEther("0.5"),
});
await tx.wait();Estimating Gas
Before sending, you can estimate how much gas a call will use:
const gas = await contract.transfer
.estimateGas(recipient, amount);
console.log("Estimated gas:", gas);If the function would revert, estimation throws — a useful early warning.
const gas = await contract.transfer
.estimateGas(recipient, amount);
console.log("Estimated gas:", gas);Setting Gas Overrides
You can override gas parameters when needed, for example on EIP-1559 chains:
const tx = await contract.transfer(recipient, amount, {
gasLimit: 100000,
maxFeePerGas: ethers.parseUnits("30", "gwei"),
maxPriorityFeePerGas: ethers.parseUnits("2", "gwei"),
});Usually the wallet picks sensible defaults, so override only when you must.
const tx = await contract.transfer(recipient, amount, {
gasLimit: 100000,
maxFeePerGas: ethers.parseUnits("30", "gwei"),
maxPriorityFeePerGas: ethers.parseUnits("2", "gwei"),
});Handling Failures
Transactions can fail by reverting, being underpriced, or by user rejection in a wallet. Wrap sends in try/catch:
try {
const tx = await contract.transfer(to, amount);
await tx.wait();
} catch (err) {
console.error("Transaction failed:", err.shortMessage);
}try {
const tx = await contract.transfer(to, amount);
await tx.wait();
} catch (err) {
console.error("Transaction failed:", err.shortMessage);
}Nonces and Ordering
Each account has a nonce — a counter ensuring transactions execute in order. ethers manages it automatically, but if you send many transactions quickly you may set it manually to avoid collisions:
const tx = await contract.mint({ nonce: 42 });Mismatched nonces cause transactions to get stuck or replaced.
const tx = await contract.mint({ nonce: 42 });Reading Events from a Receipt
After mining, you can inspect the events emitted by your transaction from the receipt logs:
const receipt = await tx.wait();
for (const log of receipt.logs) {
const parsed = contract.interface.parseLog(log);
if (parsed) console.log(parsed.name, parsed.args);
}This confirms the contract did what you expected.
const receipt = await tx.wait();
for (const log of receipt.logs) {
const parsed = contract.interface.parseLog(log);
if (parsed) console.log(parsed.name, parsed.args);
}Quick Check
Test your understanding of sending transactions.
Recap
You learned to send state-changing transactions.
- Writes require a signer; attach one with
connector at construction. - A write call returns a pending tx;
tx.wait()gives the mined receipt. - Check
receipt.status; wait for more confirmations against reorgs. - Send ETH via a
valueoverride; estimate cost withestimateGas. - Handle failures with try/catch and mind the account nonce.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengirim Transaksi” gratis?
Ya — teks lengkap “Mengirim Transaksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Web3 & DApp Development Fundamentals, upgrade ke CoddyKit PRO. Kursus Web3 & DApp Development Fundamentals mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengirim Transaksi”?
Menulis ke chain Kamu berlatih Web3 & DApp Development Fundamentals dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Web3 & DApp Development Fundamentals?
Tidak diperlukan pengalaman sebelumnya. Web3 & DApp Development Fundamentals di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengirim Transaksi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Web3 & DApp Development Fundamentals ini?
Ya. Setiap pelajaran Web3 & DApp Development Fundamentals menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menghubungkan ke Provider
- Membaca Data Kontrak
- Mengirim Transaksi
- Mendengarkan Event