#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.