Ошибка: данные выходят за рамки (длина=3, смещение=32, код=BUFFER_OVERRUN, версия=abi/5.0.7) далее-js, ethereum

#javascript #next.js #ethereum #solidity #smartcontracts

Вопрос:

Я разрабатываю проект ethereum и nextjs. Когда проект впервые был инициализирован, я получаю эту ошибку:

 Error: data out-of-bounds (length=3, offset=32, code=BUFFER_OVERRUN, version=abi/5.0.7)
    at Logger.makeError (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/logger/lib/index.js:199:21)
    at Logger.throwError (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/logger/lib/index.js:208:20)
    at Reader._peekBytes (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/abstract-coder.js:149:24)
    at Reader.readBytes (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/abstract-coder.js:161:26)
    at Reader.readValue (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/abstract-coder.js:167:48)
    at NumberCoder.decode (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/number.js:49:28)
    at /home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/array.js:106:31
    at Array.forEach (<anonymous>)
    at Object.unpack (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/array.js:85:12)
    at TupleCoder.decode (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/coders/tuple.js:39:49)
    at AbiCoder.decode (/home/Documents/projects/ethereum/kickstarter/node_modules/@ethersproject/abi/lib/abi-coder.js:93:22)
    at ABICoder.decodeParametersWith (/home/Documents/projects/ethereum/kickstarter/node_modules/web3-eth-abi/lib/index.js:303:30)
    at ABICoder.decodeParameters (/home/Documents/projects/ethereum/kickstarter/node_modules/web3-eth-abi/lib/index.js:284:17)
    at Contract._decodeMethodReturn (/home/Documents/projects/ethereum/kickstarter/node_modules/web3-eth-contract/lib/index.js:469:22)
    at Method.outputFormatter (/home/Documents/projects/ethereum/kickstarter/node_modules/web3-eth-contract/lib/index.js:759:42)
    at Method.formatOutput (/home/Documents/projects/ethereum/kickstarter/node_modules/web3-core-method/lib/index.js:146:54) {
  reason: 'data out-of-bounds',
  code: 'BUFFER_OVERRUN',
  length: 3,
  offset: 32
}
 

Я забирался внутрь getServerSideProps. Изначально у меня было это

 let campaigns;
try {
  // in solidity contract, this returns an array of contracts
  campaigns = await factory.methods.getDeployedCampaign().call();
 
} catch (e) {
  console.log("error in index server", e);
}
 

Я проверил код, не смог найти никаких проблем. Я подумал, что, возможно, проблема будет заключаться в возврате массива адресов. (Насколько я знаю, мы не можем вернуть массив структур из solidity, но массив адресов был бы в порядке). Тем не менее, я решил проводить каждую кампанию по очереди. Поэтому я изменил код контракта:

 contract CampaignFactory{
  address[] public deployedCampaigns;
  uint public campaignsCount;
  
      function createCampaign(uint minimum)public{
          Campaign newCampaign=new Campaign(minimum,msg.sender);
          deployedCampaigns.push(address(newCampaign));
          campaignsCount  ;
  
      }
      // return individual campaign
      function getDeployedCampaign(uint index) public view returns(address ){
          return deployedCampaigns[index];
      }
  
      function getCampaignCounts() public view returns(uint){
          return campaignsCount;
      }
  }
 

Затем я правильно изменил код на стороне сервера:

 export async function getServerSideProps(context) {
  let campaigns;
  let campaignsCount;
  try {
    // get the number of campaigns
    campaignsCount = await factory.methods.getCampaignCounts().call();
    campaigns = await Promise.all(
      Array(parseInt(campaignsCount))
        .fill()
        .map((element, index) => {
          return factory.methods.getDeployedCampaign(index).call();
        })
    );
    console.log("camapigns in index", campaigns);
  } catch (e) {
    console.log("error in index server", e);
  }
  return {
    props: { campaigns: campaigns || [] },
  };
}
 

После модификации я все равно получаю ту же ошибку. Но если я обновлю страницу, я больше не увижу ошибок и получу данные в пользовательском интерфейсе. Это заставляет меня думать, что с контрактом нет никаких проблем. это должно быть что-то связанное с взаимодействием с javascript.