Предположим, у меня есть контракт наследования (xyz.sol) с тремя контрактами A, B и C, так что C является B, я пытаюсь скомпилировать с помощью solc в автономном режиме в консоли узла. После компиляции у меня есть три отдельных байт-кода и сгенерированный интерфейс ABI. Только для одного контракта ABI=..... [`:xyz'].interface используется для предоставления только ABI. Теперь, поскольку в выходном скомпилированном коде присутствует больше ABI, он возвращает ошибку (undefined). Можно ли объединить весь интерфейс ABI или разделить его каким-либо методом индексации?
Я не понимаю этого утверждения:
Теперь, поскольку в выходном скомпилированном коде присутствует больше ABI, он возвращает ошибку (undefined).
Я не уверен на 100%, что именно возвращает ошибку. Зависит от того, что ты делаешь, я полагаю. Вероятно, вас должен интересовать только ABI контракта, который вы хотите развернуть.
Для каждого контракта существует ABI, и возможно, вы захотите развернуть любой из контрактов, содержащихся в вашем исходном коде. Вы обнаружите, что функции B являются частью ABI C.
Рассмотрим еще более простой пример:
pragma solidity 0.4.18;
contract A {
function aDo() public pure returns(bool success) {
return true;
}
}
contract B is A {
function bDo() public pure returns(bool success) {
return true;
}
}
Обратите внимание, что ABI для B содержит, function aDo()
потому что B is A
.
[{"constant":true,"inputs":[],"name":"bDo","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"aDo","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"}]
Компилятор предоставит вам ABI для A, но дело в том, что он вам на самом деле не нужен (или байт-код для A), если только вы не планируете развертывать A, а вы, вероятно, этого не хотите.
В большинстве случаев вам нужно развернуть только основной контракт, который унаследовал компоненты арендодателя.
Надеюсь, поможет.
ps При использовании Truffle они принимают/делают предположение, что имя исходного файла совпадает с именем контракта, который вы будете заинтересованы в развертывании (B в моем примере, C в вашем), хотя исходный код и импорт могут загрузить его многими контракты, которые не будут развернуты сами по себе.