Публикация двух контрактов

Я собираюсь опубликовать два контракта: стандартный контракт на токен и контракт на краудсейл. Какова наилучшая практика для этого?

  1. Должен ли я опубликовать его в одном файле? Значит ли это, что будет виден только второй контракт в файле?

  2. Если я опубликую сначала токен, а затем контракт на краудсейл, нужно ли жестко указывать адрес токена в контракте на краудсейл?

  3. В таком случае, как мне сделать первоначальную поставку токенов принадлежащей контракту краудсейла?

Вы употребляете трюфель?
Обычно я так и делаю, но до сих пор я играл только с приложениями с одним контрактом.

Ответы (3)

Вы можете либо поместить их в один файл и скомпилировать/развернуть по отдельности, либо поместить их в отдельные файлы.

Если вы хотите, чтобы контракты могли вызывать методы друг друга, то, если они находятся в отдельных файлах, вам нужно будет импортировать другой контракт вверху файла (например, import "./Token.sol";). Затем вы сможете легко вызвать какой-либо метод в контракте токена, например Token(someAddress).methodName(args).

Что касается управления адресами отдельных контрактов, чтобы они могли общаться друг с другом, вы можете либо сохранить адрес в переменной состояния, либо передать его в качестве аргумента функции, когда это необходимо, например.

import "./Crowdsale.sol";    

contract Token {
    Crowdsale crowdsale;
    function Token(address theAddr) {
        crowdsale = Crowdsale(theAddr);
    }

    // You could do this
    function talkToCrowdsale() {
        crowdsale.someMethod();
    }

    // or this...
    function talkToCrowdsale(address theAddr) {
        Crowdsale(theAddr).someMethod();
    }
}

Просто несколько слов о том, как это сделать в Truffle (Гарри ответил на большую часть вопроса, поэтому я предоставляю только дополнительную информацию).

В Truffle это сделать не проблема, вы можете развернуть оба контракта одновременно и использовать их в app.jsсвоем децентрализованном приложении или во всем, что вы реализуете.

Когда вы развертываете два контракта вместо одного, вы запускаете все те же команды в своей командной строке, но обязательно редактируете свою migrationsпапку, чтобы при вводе truffle migrateвашего второго контракта он также был развернут в блокчейне.

В вашем app.jsслучае вам нужно будет инициализировать свой второй контракт так же, как и первый, просто добавив

$.getJSON('Second.json', function(data) {
      var SecondArtifact = data;
      App.contracts.Second = TruffleContract(SecondArtifact);

      App.contracts.Second.setProvider(App.web3Provider);

    }) 

Если я опубликую сначала токен, а затем контракт на краудсейл, нужно ли жестко указывать адрес токена в контракте на краудсейл?

Нет, не знаешь. Когда вы переносите свои контракты в блокчейн, вы увидите что-то вроде

Running migration: 3_deploy_contracts.js
  Deploying Other...
  ... 0x197ae5e82bd7e3909b657df2e8d2d43d7184f58a2a05662d47c59e8244b608fd
  Other: 0xfb88de099e13c3ed21f80a7a1e49f8caecf10df6

и после успеха адрес контракта будет сохранен в артефактах, а затем импортирован в ваш app.js, как я уже упоминал в коде. После этого вы просто получите доступ к своим функциональным возможностям контрактов с помощью App.contracts.YourContract.

Вот, пожалуй, и все, что я хотел добавить.

Когда вы тестируете свои контракты, вам все равно нужно требовать оба «файла».

Например, у меня есть два контракта, NppToken и CrowdSale, в одном файле NppToken.sol. Вот что я пишу вверху своих тестов: var token = artifacts.require("./NppToken.sol"); var ico = artifacts.require("./CrowdSale.sol");

Что происходит за кулисами, так это то, что Truffle видит «./CrowdSale.sol» и ищет CrowdSale.json в папке /build/contracts. Неважно, что файла CrowdSale.sol нет, пока существует CrowdSale.json.