将加密机密上传到 DON 时网关 URL 错误 - Chainlink 函数

问题描述 投票:0回答:1

身体

我正在尝试使用 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
javascript ethereum solidity chainlink
1个回答
0
投票

我昨天在尝试使用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
  1. 设置密码后,添加所有环境变量的名称和值(添加的变量将永远保留在 .env.enc 中,直到您强制删除它。只是每次打开新的终端会话时都需要设置密码访问它):
npx env-enc set
  1. 访问所有变量:
npx env-enc view

好。现在您终于可以根据您的需要复制、粘贴和修改上述脚本(尽量不要弄乱导入!)。它应该有效。如果您仍然遇到困难,请随时再次联系。

© www.soinside.com 2019 - 2024. All rights reserved.