交易所需的签名数量用于计算交易成本。只要您不创建帐户,这将是基本交易成本。要了解有关创建帐户成本的更多信息,请查看计算租金成本。
web3.js v2
import {
airdropFactory,
appendTransactionMessageInstructions,
compileTransactionMessage,
createSignerFromKeyPair,
createSolanaRpc,
createSolanaRpcSubscriptions,
createTransactionMessage,
devnet,
generateKeyPairSigner,
getBase64Decoder,
getCompiledTransactionMessageEncoder,
getComputeUnitEstimateForTransactionMessageFactory,
getSignatureFromTransaction,
lamports,
pipe,
prependTransactionMessageInstructions,
sendAndConfirmTransactionFactory,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners,
type TransactionMessageBytesBase64,
} from "@solana/web3.js";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
import { getAddMemoInstruction } from "@solana-program/memo";
import { loadDefaultKeypairWithAirdrop } from "./CreateKeypair";
async function calculateCost(message: string) {
// Create an RPC.
const CLUSTER = "devnet";
const rpc = createSolanaRpc(devnet(`https://api.${CLUSTER}.solana.com`));
const rpcSubscriptions = createSolanaRpcSubscriptions(
devnet(`wss://api.${CLUSTER}.solana.com`),
);
// Create a utility that estimates a transaction message's compute consumption.
const getComputeUnitEstimate =
getComputeUnitEstimateForTransactionMessageFactory({ rpc });
// Create a transaction sending function.
const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({
rpc,
rpcSubscriptions,
});
// Create an airdrop function.
const airdrop = airdropFactory({ rpc, rpcSubscriptions });
// Create and fund an account.
const signer = await generateKeyPairSigner();
console.log("Created an account with address", signer.address);
console.log("Requesting airdrop");
await airdrop({
commitment: "confirmed",
lamports: lamports(1000_000n),
recipientAddress: signer.address,
});
console.log("Airdrop confirmed");
// Create a memo transaction.
console.log("Creating a memo transaction");
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
const transactionMessage = pipe(
createTransactionMessage({ version: "legacy" }),
m => setTransactionMessageFeePayerSigner(signer, m),
m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
m =>
appendTransactionMessageInstructions(
[
getSetComputeUnitPriceInstruction({ microLamports: 5000n }),
getAddMemoInstruction({ memo: message }),
],
m,
),
);
// Figure out how many compute units to budget for this transaction
// so that you can right-size the compute budget to maximize the
// chance that it will be selected for inclusion into a block.
console.log("Estimating the compute consumption of the transaction");
const estimatedComputeUnits =
await getComputeUnitEstimate(transactionMessage);
console.log(
`Transaction is estimated to consume ${estimatedComputeUnits} compute units`,
);
const budgetedTransactionMessage = prependTransactionMessageInstructions(
[getSetComputeUnitLimitInstruction({ units: estimatedComputeUnits })],
transactionMessage,
);
const base64EncodedMessage = pipe(
// Start with the message you want the fee for.
budgetedTransactionMessage,
// Compile it.
compileTransactionMessage,
// Convert the compiled message into a byte array.
getCompiledTransactionMessageEncoder().encode,
// Encode that byte array as a base64 string.
getBase64Decoder().decode,
) as TransactionMessageBytesBase64;
const transactionCost = await rpc
.getFeeForMessage(base64EncodedMessage)
.send();
console.log(
"Transaction is estimated to cost " + transactionCost.value + " lamports",
);
// Sign and send the transaction.
console.log("Signing and sending the transaction");
const signedTx = await signTransactionMessageWithSigners(
budgetedTransactionMessage,
);
const signature = getSignatureFromTransaction(signedTx);
console.log(
"Sending transaction https://explorer.solana.com/tx/" +
signature +
"/?cluster=" +
CLUSTER,
);
await sendAndConfirmTransaction(signedTx, { commitment: "confirmed" });
console.log("Transaction confirmed");
// Transaction is estimated to consume 6236 compute units
// Transaction is estimated to cost 5032 lamports
}
calculateCost("Hello, Fees!");
web3.js v1
import {
clusterApiUrl,
Connection,
Keypair,
Message,
SystemProgram,
SYSTEM_INSTRUCTION_LAYOUTS,
Transaction,
} from "@solana/web3.js";
import bs58 from "bs58";
(async () => {
// Connect to cluster
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const payer = Keypair.generate();
const recipient = Keypair.generate();
const type = SYSTEM_INSTRUCTION_LAYOUTS.Transfer;
const data = Buffer.alloc(type.layout.span);
const layoutFields = Object.assign({ instruction: type.index });
type.layout.encode(layoutFields, data);
const recentBlockhash = await connection.getLatestBlockhash();
const messageParams = {
accountKeys: [
payer.publicKey.toString(),
recipient.publicKey.toString(),
SystemProgram.programId.toString(),
],
header: {
numReadonlySignedAccounts: 0,
numReadonlyUnsignedAccounts: 1,
numRequiredSignatures: 1,
},
instructions: [
{
accounts: [0, 1],
data: bs58.encode(data),
programIdIndex: 2,
},
],
recentBlockhash: recentBlockhash.blockhash,
};
const message = new Message(messageParams);
const fees = await connection.getFeeForMessage(message);
console.log(`Estimated SOL transfer cost: ${fees.value} lamports`);
// Estimated SOL transfer cost: 5000 lamports
})();
https://solana.com/zh/developers/cookbook/transactions/calculate-cost
版权属于:区块链中文技术社区 / 转载原创者
本文链接:https://www.bcskill.com/index.php/archives/2290.html
相关技术文章仅限于相关区块链底层技术研究,禁止用于非法用途,后果自负!本站严格遵守一切相关法律政策!
楼主残忍的关闭了评论