我在使用Solana包@solana/web3.js的Typescript中遇到了一个bug。我已经开发了一个钱包应用程序,在这个应用程序中,我生成新的密钥对,建立连接,接收空投,获取我的publicKey的交易列表。然而,我停留在事务发送到其他钱包。
我运行下面的代码,catch方法记录了错误:[ReferenceError: Can't find variable: Buffer]我的代码:
import {
clusterApiUrl,
Connection,
LAMPORTS_PER_SOL,
Keypair,
ParsedTransactionWithMeta,
Transaction,
SystemProgram,
sendAndConfirmTransaction,
PublicKey,
Signer,
} from '@solana/web3.js';
const [keypair, setKeypair] = useState<Keypair>();
const [keypair2, setKeypair2] = useState<Keypair>();
const connection = new Connection(clusterApiUrl('devnet'), 'confirmed');
const generateNewKeys = () => {
console.log('trying to get new keypair');
setKeypair(() => Keypair.generate());
setKeypair2(() => Keypair.generate());
console.log('Generated new keypair');
};
const sendTransaction = async () => {
console.log('initializing sending');
if (keypair && keypair2) {
try {
console.log('Attempting to send');
let transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: keypair.publicKey,
toPubkey: keypair2.publicKey,
lamports: amount * LAMPORTS_PER_SOL,
}),
);
console.log('Created transaction');
const signer: Signer = keypair;
await sendAndConfirmTransaction(connection, transaction, [signer]);
updateBalance();
updateTransactions();
} catch (e) {
console.log(e);
}
}
};
当运行sendTransaction函数时,它记录"试图发送";而不是"已创建的事务"。这就指出了创建"事务"变量的问题。
老实说,我被困住了,我把我的代码和别人的进行了比较,尽管没有差异,但它不能工作。
我认为这是一个使用Create React App (CRA)和Webpack 5的项目。Webpack 5不会像以前那样自动执行Node.js API填充,所以你需要手动执行。
实际意思是:
yarn add -D buffer
还需要重写你的Webpack配置
const webpack = require("webpack");
module.exports = function override(webpackConfig) {
// ..
webpackConfig.resolve.fallback = {
buffer: require.resolve("buffer"),
};
webpackConfig.plugins = [
...webpackConfig.plugins,
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
}),
];
return webpackConfig;
};
这是一个用CRA和Webpack 5制作的Solana dApp的例子https://github.com/Bonfida/serverless-merch/blob/master/ui/config-overrides.js