身体
我正在尝试使用 RWA 项目中的 @chainlink/functions-toolkit 将加密的机密上传到 Chainlink 去中心化 Oracle 网络 (DON) 网关。但是,我在向网关发送请求时遇到错误。
我进入终端时出错
Error encountered when attempting to send request to DON gateway URL #1 of 2
https://01.functions-gateway.testnet.chain.link/: AggregateError
Error encountered when attempting to send request to DON gateway URL #2 of 2
https://02.functions-gateway.testnet.chain.link/: AggregateError
Error: Failed to send request to any of the DON gateway URLs:
["https://01.functions-gateway.testnet.chain.link/","https://02.functions-gateway.testnet.chain.link/"]
上传秘密的脚本 - uploadSecrets.js
const {
SecretsManager,
} = require("@chainlink/functions-toolkit")
const {ethers} = require('ethers');
const uploadSecrets = async () => {
const routerAddress = "0xb83E47C2bC239B3bf370bc41e1459A34b41238D0" //sepolia
const donId = "fun-ethereum-sepolia-1"
const gatewayUrls = [
"https://01.functions-gateway.testnet.chain.link/",
"https://02.functions-gateway.testnet.chain.link/",
]
const privateKey = process.env.PRIVATE_KEY.replace(/\r/g, "").trim();
if (!privateKey)
throw new Error(
"private key not provided - check your environment variables"
)
const rpcUrl = process.env.SEPOLIA_RPC_URL
if (!rpcUrl)
throw new Error(`rpcUrl not provided - check your environment variables`)
const secrets = { alpacaKey: process.env.ALPACA_KEY ?? "", alpacaSecret: process.env.ALPACA_SECRET ?? "" }
const provider = new ethers.providers.JsonRpcProvider(rpcUrl)
const wallet = new ethers.Wallet(privateKey)
const signer = wallet.connect(provider)
const secretsManager = new SecretsManager({
signer: signer,
functionsRouterAddress: routerAddress,
donId: donId,
})
await secretsManager.initialize()
const encryptedSecretsObj = await secretsManager.encryptSecrets(secrets)
const slotIdNumber = 0
const expirationTimeMinutes = 1440
console.log(
`Upload encrypted secret to gateways ${gatewayUrls}. slotId ${slotIdNumber}. Expiration in minutes: ${expirationTimeMinutes}`
)
// Upload secrets
const uploadResult = await secretsManager.uploadEncryptedSecretsToDON({
encryptedSecretsHexstring: encryptedSecretsObj.encryptedSecrets,
gatewayUrls: gatewayUrls,
slotId: slotIdNumber,
minutesUntilExpiration: expirationTimeMinutes,
})
if (!uploadResult.success)
throw new Error(`Encrypted secrets not uploaded to ${gatewayUrls}`)
console.log(
`\n Secrets uploaded properly to gateways ${gatewayUrls}! Gateways response: `,
uploadResult
)
const donHostedSecretsVersion = parseInt(uploadResult.version)
console.log(`\n Secrets version: ${donHostedSecretsVersion}`)
}
uploadSecrets().catch((e) => {
console.error(e)
process.exit(1)
})
控制台中的预期结果
Secrets uploaded properly to gateways https://01.functions-gateway.testnet.chain.link/! Gateways response
我昨天在尝试使用chainlink 函数时遇到了类似的问题。 Chainlink 有一个非常好的 repo 我推荐你去看看。检查存储库的函数示例部分。
现在来看上面的脚本,如果您使用 ethers.js 版本 6 或更高版本,我建议您降级到 5.x.x,因为 @chainlink/functions-toolkit 包目前与 ethers.js 较新版本无法正确兼容版本。要降级,请使用以下命令:
npm uninstall ethers
npm install [email protected]
此外,为了安全起见,请将以太导入更改为
const ethers = require("ethers");
现在我正在分享一个与您类似的脚本。该脚本的灵感来自于前面提到的存储库的许多示例,并且假设所有版本的软件包都相同,则可以正常工作:
const fs = require("fs");
const path = require("path");
const { SecretsManager } = require("@chainlink/functions-toolkit");
const ethers = require("ethers");
require("@chainlink/env-enc").config();
const routerAddress = "0xb83E47C2bC239B3bf370bc41e1459A34b41238D0";
const donId = "fun-ethereum-sepolia-1";
const gatewayUrls = [
"https://01.functions-gateway.testnet.chain.link/",
"https://02.functions-gateway.testnet.chain.link/",
];
const slotIdNumber = 0; // slot ID where to upload the secrets
const expirationTimeMinutes = 4000; // expiration time in minutes of the secrets
const uploadSecrets = async () => {
// Initialize ethers signer and provider to interact with the contracts onchain
const privateKey = process.env.PRIVATE_KEY; // fetch PRIVATE_KEY
if (!privateKey)
throw new Error(
"Private key not provided - check your environment variables"
);
const rpcUrl = process.env.SEPOLIA_RPC_URL; // fetch Sepolia RPC URL
if (!rpcUrl)
throw new Error("RPC URL not provided - check your environment variables");
const provider = new ethers.providers.JsonRpcProvider(rpcUrl);
const wallet = new ethers.Wallet(privateKey);
const signer = wallet.connect(provider); // create ethers signer for signing transactions
// Initialize SecretsManager
const secretsManager = new SecretsManager({
signer: signer,
functionsRouterAddress: routerAddress,
donId: donId,
});
await secretsManager.initialize();
// Define secrets to be encrypted
const secrets = { apiKey: process.env.OPENWEATHER_API_KEY };
// Encrypt secrets
console.log("Encrypting secrets...");
const encryptedSecretsObj = await secretsManager.encryptSecrets(secrets);
console.log("Secrets encrypted. Uploading to DON...");
// Upload encrypted secrets to the DON
const uploadResult = await secretsManager.uploadEncryptedSecretsToDON({
encryptedSecretsHexstring: encryptedSecretsObj.encryptedSecrets,
gatewayUrls: gatewayUrls,
slotId: slotIdNumber,
minutesUntilExpiration: expirationTimeMinutes,
});
if (!uploadResult.success) {
throw new Error(
`Encrypted secrets not uploaded. Response: ${JSON.stringify(
uploadResult
)}`
);
}
console.log("✅ Secrets uploaded successfully!");
// Fetch and log details of the uploaded secrets
console.log(`Uploaded secrets details:`);
console.log(`Version: ${uploadResult.version}`);
console.log(`Success: ${uploadResult.success}`);
console.log(`Response: ${JSON.stringify(uploadResult)}`);
console.log(`To gateways: ${gatewayUrls}`);
};
uploadSecrets().catch((e) => {
console.error(e);
process.exit(1);
});
用您自己的实现替换秘密和私钥。我还注意到您在使用环境变量时没有执行
require("dotenv").config()
操作。也许这也可能是问题所在。如果没有,请尝试按照我上面的建议进行操作。
此外,以防万一您尚未将机密存储在本地 .env.enc 文件中,请执行以下步骤:
npm i @chainlink/env-enc
2.设置密码(每次杀死当前终端并打开新终端时都必须执行此操作):
npx env-enc set-pw
npx env-enc set
npx env-enc view
好。现在您终于可以根据您的需要复制、粘贴和修改上述脚本(尽量不要弄乱导入!)。它应该有效。如果您仍然遇到困难,请随时再次联系。