我正在try 使用Hedera JavaScript SDK复制以下场景
- Bob想要向Hedera网络发送交易,但他没有HBAR来支付交易费
- 爱丽丝可以通过在Hedera网络上发送/执行他的交易来向Bob提供这项服务,包括相关的交易费
此场景涉及以下步骤:
- Bob创建事务对象(例如
TokenCreateTransaction
) - 鲍勃冻结并在交易上签字
- Alice从Bob处接收签名的交易,并添加她的签名
- Alice执行交易并支付交易费用
您可以在下面看到实现:
import {
AccountId,
TokenCreateTransaction,
TokenType,
PrivateKey,
Client,
} from "@hashgraph/sdk";
// --- BOB (SIGNER account) ---
const BOB_ACCOUNTID = "0.0.5782085";
const BOB_PRIVATE_KEY = "";
// --- ALICE (PAYER account) ---
const ALICE_ACCOUNTID = "0.0.1079726";
const ALICE_PRIVATE_KEY = "";
async function main() {
// --- BOB (SIGNER account) ---
const bobPrivateKey = PrivateKey.fromStringED25519(BOB_PRIVATE_KEY);
const bobAccountId = AccountId.fromString(BOB_ACCOUNTID);
const bobClient = Client.forTestnet().setOperator(
bobAccountId,
bobPrivateKey
);
// --- ALICE (PAYER account) ---
const alicePrivateKey = PrivateKey.fromStringED25519(ALICE_PRIVATE_KEY);
const aliceAccountId = AccountId.fromString(ALICE_ACCOUNTID);
const aliceClient = Client.forTestnet().setOperator(
aliceAccountId,
alicePrivateKey
);
// 1. Bob creates the transaction object (e.g. a `TokenCreateTransaction`)
const transaction = new TokenCreateTransaction()
.setTokenName("New Token 123")
.setTokenSymbol("NT123")
.setTokenType(TokenType.FungibleCommon)
.setInitialSupply(2000)
.setTreasuryAccountId(bobAccountId);
// 2. 鲍勃冻结并在交易上签字
const frozenTx = await transaction.freezeWith(bobClient);
const signedTx = await frozenTx.sign(bobPrivateKey);
// 3. Alice receives the signed transaction from Bob and adds her signature
const aliceSignedTx = await signedTx.sign(alicePrivateKey);
// 4. Alice执行交易并支付交易费用
const txResponse = await aliceSignedTx.execute(aliceClient);
const receipt = await txResponse.getReceipt(aliceClient);
console.log("TransactionId: " + txResponse.transactionId);
console.log("Transaction status: " + receipt.status.toString());
console.log("Created tokenId: " + receipt.tokenId);
process.exit();
}
main();
当Bob冻结事务时就会出现问题,因为SDK会自动修改某些事务属性.具体地说,transactionId
和operatorAccountId
属性是基于冷冻帐户设置的,因此将Bob指定为交易的付款人.
因此,即使Alice在流程结束时执行交易,付款人帐户实际上是Bob.
您可以在这里看到结果,其中Bob(Account ID 0.0.5782085
)是付款人帐户:https://hashscan.io/testnet/transaction/1698410500.114199003
我们如何确保爱丽丝是支付交易费的人,特别是当鲍勃是最初冻结交易费的人时?任何 idea 都将受到极大的赞赏.