Я пытаюсь разработать смарт-контракт, который позволит выполнять действия с несколькими подписями.
Так что если я, например, хочу добавить администратора в AdminStorage, мне потребуется согласие нескольких администраторов. Это точно так же, как подтверждение транзакции кошелька Multisig, но с внешним вызовом метода контракта.
Итак, у меня есть контракт AdminStorage (в Contracts/storage/AdminStorage.sol). Это всего лишь простое хранилище адресов — ничего особенного.
Но вдобавок ко всему у меня есть Multisin (в контрактах/multisig) и MultisigAddAdmin (который расширяет Multisig). Цель этого состоит в том, чтобы добавить все эти мультиподписные свойства к добавлению администратора.
Ограничений для вызывающей стороны AdminStorage.add пока нет, но это всего лишь пробный запуск. Вскоре этот метод можно будет вызывать только из MultisigAddAdmin.
Дело в том, что MultisigAddAdmin просто не будет развертываться. Никаких ошибок (типа "Проверьте свой лимит газа" при попытке деплоить и абстрагировать контракт) - ничего. Truffle отлично выполняет миграцию и даже печатает развернутый адрес, но затем я перехожу к консоли Truffle, и MultisigAddAdmin.isDeployed() имеет значение false. И я также не могу получить доступ к развернутому экземпляру из web3.js (в приложении React).
Действия по воспроизведению:
(Вам понадобится NodeJS 7, ПОСЛЕДНИЙ Truffle и testrpc)
npm install
truffle compile --all
npm install ethereumjs-testrpc
)truffle deploy
truffle console
MultisigAddAdmin.isDeployed()
Пожалуйста помоги!
В случае, если кто-то еще испытывает ту же проблему:
Проблема сохранялась при переносе контрактов. Конкретно в 2_deploy_contracts.js
.
«Реальный способ» развертывания зависимых контактов, который я всегда вижу в предложениях, не сработал для меня.
Так
deployer.deploy(
AdminStorage,
[
"0x82283F163eddAa01ca22d080873baE2D1681A94f",
"0x228B4B687be1103b0985c316C6e7CBA93B4CDaBd",
"0xC73256378982fF9e8aF364fD1b0B8Fbf2786DD45",
"0xaD392E402Dd3A0c8b7468e3dac063e777d0963Ee"
]
).then(() => {
deployer.link(AdminStorage, MultisigAddAdmin);
console.log(`AdminStorage.address: ${AdminStorage.address}`);
deployer.deploy(MultisigAddAdmin).then(() => {
console.log(`MultisigAddAdmin.address: ${MultisigAddAdmin.address}`);
});
});
По-видимому, это не тот способ, которым я должен делать инъекцию адреса контракта. Перемещение внедрения в отдельный метод, перемещение развертывания MultisigAddAdmin из обработчика промисов и вызов метода установки в реальном коде решили проблему.
Надеюсь, это поможет кому-то не тратить 4 дня на попытки понять это.