Я собираюсь опубликовать два контракта: стандартный контракт на токен и контракт на краудсейл. Какова наилучшая практика для этого?
Должен ли я опубликовать его в одном файле? Значит ли это, что будет виден только второй контракт в файле?
Если я опубликую сначала токен, а затем контракт на краудсейл, нужно ли жестко указывать адрес токена в контракте на краудсейл?
В таком случае, как мне сделать первоначальную поставку токенов принадлежащей контракту краудсейла?
Вы можете либо поместить их в один файл и скомпилировать/развернуть по отдельности, либо поместить их в отдельные файлы.
Если вы хотите, чтобы контракты могли вызывать методы друг друга, то, если они находятся в отдельных файлах, вам нужно будет импортировать другой контракт вверху файла (например, 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.
Луис Соареш
улу