Hẳn những lập trình viên Dapp lâu năm lẫn cả những bạn beginer sẽ không quá xa lạ với thư viện web3.js dùng để tương tác với Ethereum blockchain. Còn với ethers.js thì hẳn chưa có quá nhiều người biết (mình cũng mới được biết và sử dụng trong thời gian gần đây). Sau một thời gian sử dụng và làm việc với ethers.js, mình thấy nó có 1 ưu điểm muốn chia sẻ với mọi người qua bài viết ngày hôm nay.
1. Giới thiệu
Nói một cách đơn giản, ethers.js là một thư viện được viết bằng Javascript giúp Dapp tương tác với mạng Ethereum Blockchain.
Các tính năng nổi bật ethers.js gồm có
- Giữ private key ở client một cách an toàn
- Import và export JSON wallets
- Import và export ví theo chuẩn BIP 39
- Hỗ trợ ABI, ABIv2 và Human-Readable ABI
- Kết nối với Ethereum nodes thông qua nhiều provider như JSON-RPC, INFURA, Etherscan, Alchemy, Cloudflare, MetaMask …
- Hỗ trợ ENS
- Nhẹ (88kb khi nén và 284kb khi không nén)
- Hỗ trợ TypeScript
Cài đặt và import
1 2 | <span class="token function">npm</span> <span class="token function">install</span> --save ethers |
1 2 3 | <span class="token comment">// Node.js</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> ethers <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"ethers"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
1 2 3 | <span class="token comment">// ES6 hoặc TypeScript</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> ethers <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"ethers"</span><span class="token punctuation">;</span> |
1 2 3 4 5 6 | <span class="token comment">// ES6 trên trình duyệt</span> <span class="token operator"><</span>script type<span class="token operator">=</span><span class="token string">"module"</span><span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> ethers <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"</span><span class="token punctuation">;</span> <span class="token comment">// Your code here...</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> |
2. Sử dụng
Kết nối
1 2 3 | <span class="token comment">// Với Metamask</span> <span class="token keyword">const</span> provider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>providers<span class="token punctuation">.</span>Web3Provider</span><span class="token punctuation">(</span>window<span class="token punctuation">.</span>ethereum<span class="token punctuation">)</span> |
1 2 3 | <span class="token comment">// Kết nối qua JSON-RPC, mặc định là http://localhost:8545</span> <span class="token keyword">const</span> provider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>providers<span class="token punctuation">.</span>JsonRpcProvider</span><span class="token punctuation">(</span><span class="token string">'URL RPC'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Query
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">// Truy vấn block number hiện tại</span> provider<span class="token punctuation">.</span><span class="token function">getBlockNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// { Promise: 11792922 }</span> <span class="token comment">// Truy vấn số dư ETH</span> balance <span class="token operator">=</span> <span class="token keyword">await</span> provider<span class="token punctuation">.</span><span class="token function">getBalance</span><span class="token punctuation">(</span><span class="token string">"ethers.eth"</span><span class="token punctuation">)</span> <span class="token comment">// { BigNumber: "2337132817842795605" }</span> ethers<span class="token punctuation">.</span>utils<span class="token punctuation">.</span><span class="token function">formatEther</span><span class="token punctuation">(</span>balance<span class="token punctuation">)</span> <span class="token comment">// '2.337132817842795605'</span> <span class="token comment">// If a user enters a string in an input field, you may need</span> <span class="token comment">// to convert it from ether (as a string) to wei (as a BigNumber)</span> ethers<span class="token punctuation">.</span>utils<span class="token punctuation">.</span><span class="token function">parseEther</span><span class="token punctuation">(</span><span class="token string">"1.0"</span><span class="token punctuation">)</span> <span class="token comment">// { BigNumber: "1000000000000000000" }</span> |
Thao tác ghi dữ liệu vào blockchain
Để thực hiện các giao dịch làm thay đổi trạng thái của blockchain, giao dịch gửi đi phải được ký bằng private của 1 account. Cơ bản chúng ta sẽ có 2 cách là lấy tài khoản mặc định từ provider và import account vào bằng private key
Cách 1:
Mình chạy ganache-cli
lên ở cổng 8545, ganache-cli
sẽ tạo cho chúng ta 10 tài khoản.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">const</span> <span class="token punctuation">{</span> ethers<span class="token punctuation">,</span> Wallet <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'ethers'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> provider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>providers<span class="token punctuation">.</span>JsonRpcProvider</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> signer <span class="token operator">=</span> provider<span class="token punctuation">.</span><span class="token function">getSigner</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">await</span> signer<span class="token punctuation">.</span><span class="token function">getAddress</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Gửi 1 ETH</span> <span class="token keyword">const</span> tx <span class="token operator">=</span> <span class="token keyword">await</span> signer<span class="token punctuation">.</span><span class="token function">sendTransaction</span><span class="token punctuation">(</span><span class="token punctuation">{</span> to<span class="token operator">:</span> <span class="token string">'0x999E01f04Bb155AbdFc4B2200D762800a758c469'</span><span class="token punctuation">,</span> value<span class="token operator">:</span> ethers<span class="token punctuation">.</span>utils<span class="token punctuation">.</span><span class="token function">parseEther</span><span class="token punctuation">(</span><span class="token string">'1.0'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span><span class="token keyword">await</span> signer<span class="token punctuation">.</span><span class="token function">getBalance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Kết qủa in ra sẽ là tài khoản số 0 và balance của signer cũng giảm đi 1 ETH
1 2 | 0x58232B661A58112ab6e491918fddE2793D5Dd4Cc |
Cách 2: Import tài khoản bên ngoài
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">const</span> <span class="token punctuation">{</span> ethers<span class="token punctuation">,</span> Wallet <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'ethers'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> provider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>providers<span class="token punctuation">.</span>JsonRpcProvider</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> signer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Wallet</span><span class="token punctuation">(</span><span class="token string">'PRIVATE_KEY'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Cách 1 thì signer đã được connect sẵn với provider, với cách này thì chúng ta cần connect tài khoản với provider để có thể thực thi giao dịch</span> <span class="token keyword">let</span> wallet <span class="token operator">=</span> signer<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>provider<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Hoặc chúng ta có thể dùng thêm các phương thức khác như tạo random account, load từ mnemonic, …
ethers.Wallet.createRandom( [ options = {} ] )
ethers.Wallet.fromEncryptedJson( json , password [ , progress ] )
ethers.Wallet.fromEncryptedJsonSync( json , password )
ethers.Wallet.fromMnemonic( mnemonic [ , path , [ wordlist ] ] )
Thao tác với contract
Để tương tác với bất kỳ contract nào trong Ethereum thì chúng ta đều cần 2 thông tin đó là địa chỉ contract và ABI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">const</span> <span class="token punctuation">{</span> ethers<span class="token punctuation">,</span> Wallet <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'ethers'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> provider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>providers<span class="token punctuation">.</span>JsonRpcProvider</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> signer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Wallet</span><span class="token punctuation">(</span><span class="token string">'PRIVATE_KEY'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> wallet <span class="token operator">=</span> signer<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>provider<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> contract <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>Contract</span><span class="token punctuation">(</span><span class="token string">'ADDRESS'</span><span class="token punctuation">,</span> <span class="token string">'ABI'</span><span class="token punctuation">,</span> provider<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Kết nối wallet với contract</span> <span class="token keyword">const</span> withSigner <span class="token operator">=</span> contract<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>wallet<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
1 ưu điểm của việc gọi hàm trong contract bằng ethers.js
so với web3.js
là không cần dài dòng thêm call()
hay send()
ở cuối.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token keyword">const</span> daiAddress <span class="token operator">=</span> <span class="token string">"dai.tokens.ethers.eth"</span><span class="token punctuation">;</span> <span class="token keyword">const</span> daiAbi <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token comment">// Some details about the token</span> <span class="token string">"function name() view returns (string)"</span><span class="token punctuation">,</span> <span class="token string">"function symbol() view returns (string)"</span><span class="token punctuation">,</span> <span class="token comment">// Get the account balance</span> <span class="token string">"function balanceOf(address) view returns (uint)"</span><span class="token punctuation">,</span> <span class="token comment">// Send some of your tokens to someone else</span> <span class="token string">"function transfer(address to, uint amount)"</span><span class="token punctuation">,</span> <span class="token comment">// An event triggered whenever anyone transfers to someone else</span> <span class="token string">"event Transfer(address indexed from, address indexed to, uint amount)"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">const</span> daiContract <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>Contract</span><span class="token punctuation">(</span>daiAddress<span class="token punctuation">,</span> daiAbi<span class="token punctuation">,</span> provider<span class="token punctuation">)</span><span class="token punctuation">;</span> daiContract<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// { Promise: 'Dai Stablecoin' }</span> daiContract<span class="token punctuation">.</span><span class="token function">symbol</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// { Promise: 'DAI' }</span> balance <span class="token operator">=</span> <span class="token keyword">await</span> daiContract<span class="token punctuation">.</span><span class="token function">balanceOf</span><span class="token punctuation">(</span><span class="token string">"ricmoo.firefly.eth"</span><span class="token punctuation">)</span> <span class="token comment">// { BigNumber: "198172622063578627973" }</span> ethers<span class="token punctuation">.</span>utils<span class="token punctuation">.</span><span class="token function">formatUnits</span><span class="token punctuation">(</span>balance<span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">)</span> <span class="token comment">// '198.172622063578627973'</span> |
Truy vấn lịch sử giao dịch (Query Historic Events)
Một tính năng khá hay ho của ethers.js
mà mình chưa được mục kích sở thị trên web3.js
đó là khả năng lọc, truy vấn lịch sử giao dịch. Chúng có thể dễ dàng tìm kiếm các giao dịch đầu vào, đầu ra theo điều kiện cho trước.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | <span class="token keyword">const</span> <span class="token punctuation">{</span> ethers<span class="token punctuation">,</span> Wallet <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'ethers'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> provider <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>providers<span class="token punctuation">.</span>JsonRpcProvider</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> signer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Wallet</span><span class="token punctuation">(</span><span class="token string">'PRIVATE_KEY'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> wallet <span class="token operator">=</span> signer<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>provider<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> myAddress <span class="token operator">=</span> signer<span class="token punctuation">.</span><span class="token function">getAddress</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ...</span> <span class="token keyword">const</span> daiContract <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ethers<span class="token punctuation">.</span>Contract</span><span class="token punctuation">(</span>daiAddress<span class="token punctuation">,</span> daiAbi<span class="token punctuation">,</span> provider<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Filter tất cả giao dịch gửi token DAI từ myAddress</span> <span class="token keyword">let</span> filterFrom <span class="token operator">=</span> <span class="token keyword">await</span> daiContract<span class="token punctuation">.</span>filters<span class="token punctuation">.</span><span class="token function">Transfer</span><span class="token punctuation">(</span>myAddress<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// {</span> <span class="token comment">// address: 'dai.tokens.ethers.eth',</span> <span class="token comment">// topics: [</span> <span class="token comment">// '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',</span> <span class="token comment">// '0x0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72'</span> <span class="token comment">// ]</span> <span class="token comment">// }</span> <span class="token comment">// Filter tất cả giao dịch gửi token DAI cho myAddress</span> <span class="token keyword">let</span> filterTo <span class="token operator">=</span> <span class="token keyword">await</span> daiContract<span class="token punctuation">.</span>filters<span class="token punctuation">.</span><span class="token function">Transfer</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> myAddress<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// {</span> <span class="token comment">// address: 'dai.tokens.ethers.eth',</span> <span class="token comment">// topics: [</span> <span class="token comment">// '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',</span> <span class="token comment">// null,</span> <span class="token comment">// '0x0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72'</span> <span class="token comment">// ]</span> <span class="token comment">// }</span> <span class="token comment">// Filter các giao dịch gửi DAI token từ myAddress trong khoảng block [9843470, 9843480]</span> daiContract<span class="token punctuation">.</span><span class="token function">queryFilter</span><span class="token punctuation">(</span>filterFrom<span class="token punctuation">,</span> <span class="token number">9843470</span><span class="token punctuation">,</span> <span class="token number">9843480</span><span class="token punctuation">)</span> <span class="token comment">// { Promise: [</span> <span class="token comment">// {</span> <span class="token comment">// address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',</span> <span class="token comment">// args: [</span> <span class="token comment">// '0x8ba1f109551bD432803012645Ac136ddd64DBA72',</span> <span class="token comment">// '0x8B3765eDA5207fB21690874B722ae276B96260E0',</span> <span class="token comment">// { BigNumber: "4750000000000000000" }</span> <span class="token comment">// ],</span> <span class="token comment">// blockHash: '0x8462eb2fbcef5aa4861266f59ad5f47b9aa6525d767d713920fdbdfb6b0c0b78',</span> <span class="token comment">// blockNumber: 9843476,</span> <span class="token comment">// data: '0x00000000000000000000000000000000000000000000000041eb63d55b1b0000',</span> <span class="token comment">// decode: [Function],</span> <span class="token comment">// event: 'Transfer',</span> <span class="token comment">// eventSignature: 'Transfer(address,address,uint256)',</span> <span class="token comment">// getBlock: [Function],</span> <span class="token comment">// getTransaction: [Function],</span> <span class="token comment">// getTransactionReceipt: [Function],</span> <span class="token comment">// logIndex: 69,</span> <span class="token comment">// removeListener: [Function],</span> <span class="token comment">// removed: false,</span> <span class="token comment">// topics: [</span> <span class="token comment">// '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',</span> <span class="token comment">// '0x0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72',</span> <span class="token comment">// '0x0000000000000000000000008b3765eda5207fb21690874b722ae276b96260e0'</span> <span class="token comment">// ],</span> <span class="token comment">// transactionHash: '0x1be23554545030e1ce47391a41098a46ff426382ed740db62d63d7676ff6fcf1',</span> <span class="token comment">// transactionIndex: 81</span> <span class="token comment">// },</span> <span class="token comment">// {</span> <span class="token comment">// address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',</span> <span class="token comment">// args: [</span> <span class="token comment">// '0x8ba1f109551bD432803012645Ac136ddd64DBA72',</span> <span class="token comment">// '0x00De4B13153673BCAE2616b67bf822500d325Fc3',</span> <span class="token comment">// { BigNumber: "250000000000000000" }</span> <span class="token comment">// ],</span> <span class="token comment">// blockHash: '0x8462eb2fbcef5aa4861266f59ad5f47b9aa6525d767d713920fdbdfb6b0c0b78',</span> <span class="token comment">// blockNumber: 9843476,</span> <span class="token comment">// data: '0x00000000000000000000000000000000000000000000000003782dace9d90000',</span> <span class="token comment">// decode: [Function],</span> <span class="token comment">// event: 'Transfer',</span> <span class="token comment">// eventSignature: 'Transfer(address,address,uint256)',</span> <span class="token comment">// getBlock: [Function],</span> <span class="token comment">// getTransaction: [Function],</span> <span class="token comment">// getTransactionReceipt: [Function],</span> <span class="token comment">// logIndex: 70,</span> <span class="token comment">// removeListener: [Function],</span> <span class="token comment">// removed: false,</span> <span class="token comment">// topics: [</span> <span class="token comment">// '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',</span> <span class="token comment">// '0x0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72',</span> <span class="token comment">// '0x00000000000000000000000000de4b13153673bcae2616b67bf822500d325fc3'</span> <span class="token comment">// ],</span> <span class="token comment">// transactionHash: '0x1be23554545030e1ce47391a41098a46ff426382ed740db62d63d7676ff6fcf1',</span> <span class="token comment">// transactionIndex: 81</span> <span class="token comment">// }</span> <span class="token comment">// ] }</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Kết luận
Trong giới hạn bài viết, mình đã cùng các bạn tìm hiểu cách sử dụng cơ bản ethers.js
để tương tác với mạng Ethereum, chi tiết kỹ hơn và các hàm, tham số thì mọi người có thể dễ dàng tham khảo ở tài liệu chính thức từ ethers.js
Những gì web3.js
làm được, gần như ethers.js
cũng làm được và thậm chí có cú pháp gọn gàng hơn (gọi hàm trong contrat). Ngoài trừ hàm web3.eth.net.isListening()
trên web3.js
để kiếm tra kết nối đến provider
có thành công hay không thì mình chưa tìm được hàm tương tự trên ethers.js
Combo Hardhat
và ether.js
đang được team mình sử dụng thay thế dần cho bộ đôi huyền thoại truffle
và web3.js
và hoạt động khá trơn tru. Các bạn có thể cân nhắc chuyển qua dùng thử bộ đôi trên