iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
自我挑戰組

Viem 介紹系列 第 8

Day 8 - Transaction (1)

  • 分享至 

  • xImage
  •  

Transaction

區塊鏈的動作可以想像是提交一個事物

call

呼叫區塊鏈事件,呼叫這個時就和呼叫 Rpc 的 eth_call 是一樣的。

其實每個 function 封裝都配合 ETH RPC 的 請求,所以如果你有架設自己的節點服務,也會以喔。/images/emoticon/emoticon07.gif

下面的範例是呼叫 USDT 的 balanceOf (通常這個功能是要知道目前地址的 USDT 餘額有多少)

查詢:0xa6a688F107851131F0E1dce493EbBebFAf99203e 的餘額

import { createPublicClient, http } from 'viem';
import { encodeFunctionData } from 'viem';
import { mainnet } from 'viem/chains';

const publicClient = createPublicClient({
	chain: mainnet,
	transport: http(),
});

//https://abi.hashex.org/

const eFD = await encodeFunctionData({
	address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
	abi: [
		{
			constant: true,
			inputs: [{ name: 'who', type: 'address' }],
			name: 'balanceOf',
			outputs: [{ name: '', type: 'uint256' }],
			payable: false,
			stateMutability: 'view',
			type: 'function',
		},
	],
	functionName: 'balanceOf',
	args: ['0xa6a688F107851131F0E1dce493EbBebFAf99203e'],
}); // 編譯 bycode,這裡要看一下前端和合約溝通都要使用 abi(很重要),就像介面一樣

console.log(eFD); // 0x70a08231000000000000000000000000a6a688f107851131f0e1dce493ebbebfaf99203e

const data = await publicClient.call({
	data: eFD,
	to: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
});
// 傳送訊息

console.log('data', data);`
// https://www.rapidtables.com/convert/number/hex-to-decimal.html 轉型

初學者因該看得頭昏眼花,小弟在一開始學時也搞不清楚,但是 solidity 是執行在 EVM 上的,而它執行 是使用 Bytecode 形式,所以在執行時都要轉換成 Bytecode 才可以,當然我們是使用call

才會需要做這樣的轉換,如果大家想更清楚可以看一下這個 eth_call 其實一切都是 Ethereum Client提供的 JSON-RPC API 。

大家可以用著個網站感受一下 https://abi.hashex.org/ 操作一下就會比較好理解

https://ithelp.ithome.com.tw/upload/images/20230909/20162055R2Xk6hfELk.png

千辛萬苦看懂了,執行一下發現…

0x0000000000000000000000000000000000000000000000000000000177ba4393這是什麼….

當然永遠不會讓我們失望又要轉碼了,還好現在工具都很多下面提供工具網址

https://www.rapidtables.com/convert/number/hex-to-decimal.html

https://ithelp.ithome.com.tw/upload/images/20230909/20162055LPPwb4Dkxf.png

好不容易啊,終於全部搞懂。

接下來我們說一下幾個重要的屬性

  • account 從哪邊地址來(取代from)
  • data 呼叫智能合約的 function 以及 參數
  • to 傳到哪個地址 or 合約

如果你的 Call 有做到交易或是寫入智能合約那這幾個屬性一定要使用喔

  • gas 交易執行提供的Gas
  • gasPrice Gas費用 (基本單位 wei) https://eth-converter.com/ 單位轉換的網址
  • maxFeePerGas 最大Gas費用
  • maxPriorityFeePerGas 最大Gas優先費用
  • value 傳送金額 (ex:eth)

個人覺得交易時最要注意的就是單位 如果沒注意其實會容易錯… 沒關係Viem 也有提供好用的轉型工具可以使用(後面會說到)

不過鐵人賽也是第一次參加規則不是清楚,好像失敗了...,但我還會持續更新的

程式實作:
https://github.com/0xRory/ITHepleViem/blob/main/examples/3_7_Transaction.js

參考:
https://viem.sh/docs/actions/public/call.html


上一篇
Day 7 - Public Action (2)
下一篇
Day 9 - Transaction (2)
系列文
Viem 介紹11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言