본문으로 건너뛰기
이 페이지는 영문에서 기계 번역되었으므로 오역이나 어색한 표현이 있을 수 있습니다. 따라서 정확한 정보는 영어 원문을 참조하시기 바랍니다. 또한 잦은 업데이트로 인해 일부 콘텐츠는 영문이 그대로 남아있을 수 있습니다. Crowdin에서 이 페이지의 번역을 개선하는 데 동참하여 도움을 주세요. (Crowdin translation page, Contributing guide)

스마트 컨트랙트 실행

TxTypeSmartContractExecution은 주어진 데이터로 스마트 컨트랙트를 실행합니다. TxTypeSmartContractExecution은 "to"가 스마트 컨트랙트 계정인 경우에만 허용됩니다.

이러한 유형의 트랜잭션은 계정 생성, 토큰 전송, 스마트 컨트랙트 배포, 스마트 컨트랙트 실행, 또는 앞서 언급한 여러 가지를 혼합하여 수행할 수 있습니다.

웹3에서 Kaia 기능을 추가하기 위해 @Kaia체인/viem-ext 패키지를 가져옵니다.

HTTP** 전송(http())을 통해 Kaia Kairos 테스트넷(Kairos)과 상호 작용하도록 구성된 createPublicClient를 사용하여 publicClient를 생성합니다. 퍼블릭 클라이언트는 개인 키나 서명 기능 없이 블록체인 쿼리 또는 스마트 컨트랙트 상태 읽기와 같은 읽기 전용 작업에 사용됩니다.

Kairos 체인**, HTTP 전송, 계정으로 변환된 발신자의 개인 키로 구성된 createWalletClient를 사용하여 지갑 클라이언트를 설정합니다.

실행하려는 계약 주소를 to 필드에 설정하고 ABI를 설정합니다.

함수 이름과 파라미터를 encodeFunctionData 함수로 인코딩합니다.

준비 트랜잭션 요청**을 사용해 스마트 컨트랙트 실행을 위한 트랜잭션 요청을 생성합니다. 트랜잭션 유형 **(TxType.smartContractExecution)**을 지정합니다.

TX를 블록체인으로 전송합니다. 함수 sendTransaction은 계정의 개인 키로 내부적으로 서명한 다음 블록체인 네트워크로 전송합니다.

publicClient**는 스마트 컨트랙트에서 number 함수를 호출하여 컨트랙트의 상태에 저장된 현재 값을 가져옵니다.

smartContractExecution.js

import {
http,
encodeFunctionData,
createWalletClient, createPublicClient, kairos,
TxType,
privateKeyToAccount
} from "@kaiachain/viem-ext";
const publicClient = createPublicClient({
chain: kairos,
transport: http(),
});
const senderWallet = createWalletClient({
chain: kairos,
transport: http(),
account: privateKeyToAccount(
"0x0e4ca6d38096ad99324de0dde108587e5d7c600165ae4cd6c2462c597458c2b8"
),
});
// Example usage
(async () => {
const contractAddr = "0x95Be48607498109030592C08aDC9577c7C2dD505";
const abi = [{ "inputs": [{ "internalType": "uint256", "name": "initNumber", "type": "uint256" }], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [{ "indexed": false, "internalType": "uint256", "name": "number", "type": "uint256" }], "name": "SetNumber", "type": "event" }, { "inputs": [], "name": "increment", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "number", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "newNumber", "type": "uint256" }], "name": "setNumber", "outputs": [], "stateMutability": "nonpayable", "type": "function" }];
const data = encodeFunctionData({
abi,
args: [Date.now()],
functionName: "setNumber",
});
const tx = await senderWallet.prepareTransactionRequest({
type: TxType.SmartContractExecution,
account: senderWallet.account,
to: contractAddr,
value: 0,
data,
});
console.log("preparedTx", tx);
const sentTx = await senderWallet.sendTransaction(tx);
console.log("contract interaction tx", sentTx);
const result = await publicClient.readContract({
address: contractAddr,
abi,
functionName: 'number'
})
console.log('Current contract value', result);
})();

output

❯ node smartContractExecution.js
preparedTx {
type: 48,
account: {
address: '0xA2a8854b1802D8Cd5De631E690817c253d6a9153',
nonceManager: undefined,
sign: [AsyncFunction: sign],
signAuthorization: [AsyncFunction: signAuthorization],
signMessage: [AsyncFunction: signMessage],
signTransaction: [AsyncFunction: signTransaction],
signTypedData: [AsyncFunction: signTypedData],
source: 'privateKey',
type: 'local',
publicKey: '0x04dc9dccbd788c00fa98f7f4082f2f714e799bc0c29d63f04d48b54fe6250453cdaf06ca34ae8714cf3dae06bacdb78c7c2d4054bd38961d40853cd5f15955da79'
},
to: '0x95Be48607498109030592C08aDC9577c7C2dD505',
value: 0,
data: '0x3fb5c1cb000000000000000000000000000000000000000000000000000001977b9b017d',
from: '0xA2a8854b1802D8Cd5De631E690817c253d6a9153',
nonce: 2384,
chainId: 1001,
gas: 27953n,
gasPrice: '0x66720b300',
gasLimit: 69882
}
contract interaction tx 0x50d708b08ae4de72e9e52212eb48ec317032c2d7d06620b615d819ecdf004e8f
Current contract value 1750125336184n

페이지를 개선해 주세요