Когда я развиваюсь в солидности в сочетании с web3.js, недавно я столкнулся с некоторой проблемой. Я создаю код контракта ниже
//setContractDetail(index,bool isConsentItem,uint8[] detailItems)
function setContractDetail(uint8 index,bool isConsentItem,uint8[] detailItems) public checkOwner{
consentForm.items[index].isConsent= isConsentItem;
consentForm.items[index].itemDetail = detailItems;
/* emit SetContractDetailEvent(msg.sender,index,isConsentItem,detailItems,now); */
}
function setContractDetail2(uint8 index,bool isConsentItem) public checkOwner{
consentForm.items[index].isConsent = isConsentItem;
}
function setContractDetail3(uint8[] index,bool isConsentItem,uint8[] detailItems) public checkOwner{
for(uint i=0;i<index.length;i++){
uint pointer = index[i];
consentForm.items[pointer].isConsent= isConsentItem;
consentForm.items[pointer].itemDetail = detailItems;
}
/* emit SetContractDetailEvent(msg.sender,index,isConsentItem,detailItems,now); */
}
function setContractDetail4(bool isTest,uint8[] index,bool isConsentItem,uint8[] detailItems) public checkOwner{
for(uint i=0;i<index.length;i++){
uint pointer = index[i];
consentForm.items[pointer].isConsent= isConsentItem;
consentForm.items[pointer].itemDetail = detailItems;
}
/* emit SetContractDetailEvent(msg.sender,index,isConsentItem,detailItems,now); */
}
Когда я передаю первый параметр в виде массива (setContractDetail3), я всегда получаю сообщение об ошибке - ERROR Error: Error: требуется газ, превышающий норму или всегда терпящая неудачу транзакция . Однако, когда я устанавливаю значение, отличное от массива, в качестве первого параметра, вызов функции будет выполняться хорошо. Кто-нибудь знает, в чем причина этой проблемы?
ps Я мог успешно скомпилировать ремикс, но после того, как я установил контракт в консоли geth, а также подключился к web3.js, он в конечном итоге потерпел неудачу.
Можно использовать динамические массивы в качестве аргумента функции, используя ABIEncoderV2 для функции твердости.
Обратитесь к следующему выпуску Github и блогу для получения более подробной информации:
https://github.com/ethereum/solidity/issues/2708
https://blog.ricmoo.com/solidity-abiv2-a-foray-into-the-experimental-a6afd3d47185
Однако использование нескольких динамических массивов в качестве аргумента может быть еще одной проблемой, поскольку в Java аргумент переменной длины должен быть последним аргументом функции, а использование нескольких аргументов переменной длины в одной и той же функции не допускается.
Надеюсь, поможет.
Здесь применяется ошибка, всегда приводящая к сбою транзакции - если вы передаете массив в качестве значения, если только структура consentForm.items
не полностью идентична передаваемому массиву, транзакция будет искать, например, "randomStringThatIUsedToNameTheFirstItemInMyArray" и сравнивать его с любым items[0] обозначается как. Вероятно, это приведет к ошибке, и ваша функция застрянет в цикле, т . е. транзакция всегда будет завершаться ошибкой .
Помимо этой причины, я бы реструктурировал контракт, так как такие циклы всегда
а) опасный б) газовый тяжелый
... и, возможно, использовать блок try/catch в цикле в случае такой ошибки.
Ха ДЖАНГ
Гермес Кенг
Ха ДЖАНГ
estimateGas({from:account})
, недостаточно, потому что в нем не хватает информации для оценки газа. Вы должны предоставить достаточно информации, как показано нижеХа ДЖАНГ