deh222 (OP)
Copper Member
Jr. Member
Offline
Activity: 76
Merit: 1
|
|
July 10, 2018, 08:58:43 AM |
|
Добрый день. Готовим смарт контракт ICO,при компиляции контракта на вкладке Analyse в ремиксе есть сообщения о том, что какие-то функции требуют бесконечного газа, а где то потенциальная уязвимость.
1) У нас три этапа ICO, Мы решили написать функцию с простановкой паузы при завершении любого этапа и финализации.
Мы идем по списку дольщиков, у нас там массив и мы его в цикле перебираем, чтобы всем отправить токены. А так же начисляем бонус за этап. 1 этап +20% токенов, 2 этап +15% токенов и т.д. Вот:
for (uint i = 0; i < parts.length; i++) { // Идем по списку всех дольщиков totalPercent += parts.percent; // Складываем общий процент каждого дольщика }
for - это и есть цикл
Но главное это массовая рассылка токенов, в конце ICO инвесторам, тут идет запись данных в блокчейн, очень по итогу дорогая операция:
Сейчас вот это
function finalize() onlyOwner NotFinalized public { uint totalPercent = 0; // Итоговый процент всех дольщиков for (uint i = 0; i < parts.length; i++) { // Идем по списку всех дольщиков totalPercent += parts.percent; // Складываем общий процент каждого дольщика }
uint256 totalSupply = token.totalSupply(); totalSupply = totalSupply + // Добавляем сумму токенов дольщиков к общей сумме выпущенных токенов // Рассчитываем включенный процент в итоговую сумму (totalSupply - (totalSupply / (1 - (1 * totalPercent / 100)))); // Сумму рассчитаных доп токенов
for ( i = 0; i < parts.length; i++) { // Идем по списку всех дольщиков token.publicAsyncSend(parts.addr, (totalSupply * parts.percent) / 100);// Перечисляем всем токены }
for ( i = 0; i < bounty.length; i++) { // Идем по списку всех баунти token.publicAsyncSend(bounty.addr, (totalSupply * bounty.percent) / 100);// Перечисляем всем токены }
emit Finalize(); // Дергаем логгирование закрытия ICO isFinalized = true; // Ставим флаг закрытия ICO }
Есть конечно примеры уже опробованные которые можно использовать, конечно можно подергать с гетхаба, но хотелось бы услышать мнение тех кто знаком с данным вопросом, кто сталкивался, как наиболее разумно это реализовать .Спасибо.
|
|
|
|
neHcuoHep
Newbie
Offline
Activity: 61
Merit: 0
|
|
July 10, 2018, 12:39:20 PM |
|
новую тему создавать не стал напишу в этой const openingTime = 1514764800; // 15 Июня 2018 что это за херня как написать 11 Июля в таком виде чот вкурить не могу
|
|
|
|
ligor
Full Member
Offline
Activity: 1246
Merit: 138
Hodl DeepOnion
|
|
July 10, 2018, 01:05:42 PM |
|
новую тему создавать не стал напишу в этой const openingTime = 1514764800; // 15 Июня 2018 что это за херня как написать 11 Июля в таком виде чот вкурить не могу Похоже на Unix time, правда конвертор выдал для 1514764800 Mon, 01 Jan 2018 00:00:00 GMT http://www.onlineconversion.com/unix_time.htm
|
|
|
|
neHcuoHep
Newbie
Offline
Activity: 61
Merit: 0
|
|
July 10, 2018, 01:15:12 PM |
|
спасибо) будем колдовать дальше
|
|
|
|
YYY2006
Newbie
Offline
Activity: 13
Merit: 0
|
|
July 10, 2018, 03:13:09 PM |
|
for (uint i = 0; i < parts.length; i++) { // Идем по списку всех дольщиков totalPercent += parts.percent; // Складываем общий процент каждого дольщика }
for - это и есть цикл
Но главное это массовая рассылка токенов, в конце ICO инвесторам, тут идет запись данных в блокчейн, очень по итогу дорогая операция
Я думаю это потому, что у вас изначально не определено количество дольщиков parts.length. Поэтому не возможно изначально расчитать количество газа на все переводы токенов.
|
|
|
|
deh222 (OP)
Copper Member
Jr. Member
Offline
Activity: 76
Merit: 1
|
|
July 10, 2018, 09:13:44 PM |
|
for (uint i = 0; i < parts.length; i++) { // Идем по списку всех дольщиков totalPercent += parts.percent; // Складываем общий процент каждого дольщика }
for - это и есть цикл
Но главное это массовая рассылка токенов, в конце ICO инвесторам, тут идет запись данных в блокчейн, очень по итогу дорогая операция
Я думаю это потому, что у вас изначально не определено количество дольщиков parts.length. Поэтому не возможно изначально расчитать количество газа на все переводы токенов. Спасибо, вроде очевидно, а не увидели этот момент. Но не совсем понятно как в Solidity задавать массивы? Ни где не нашел инфу об этом?
|
|
|
|
neHcuoHep
Newbie
Offline
Activity: 61
Merit: 0
|
|
July 11, 2018, 07:39:48 AM Last edit: July 11, 2018, 08:42:28 AM by neHcuoHep |
|
еще вопросик, все делаю по этой инструкции про пять минут это кончено бред какой то) уже третий день ковыряюсь, дошел до пункта после этой команды выскакивает ошибка https://i.imgur.com/uHGpXdt.jpgя так понимаю что проблема в truffle.js та мнадо прописать настройки сети а вот где бы их взять вот так пробовал все равно ошибка: module.exports = { networks: { localhost: { host: "localhost", port: 8545, network_id: "*" }, ropsten: { host: "localhost", port: 8545, gas: 4700000, gasPrice: 1000000000, network_id: "1" } } };
|
|
|
|
YYY2006
Newbie
Offline
Activity: 13
Merit: 0
|
|
July 11, 2018, 02:13:57 PM |
|
for (uint i = 0; i < parts.length; i++) { // Идем по списку всех дольщиков totalPercent += parts.percent; // Складываем общий процент каждого дольщика }
for - это и есть цикл
Но главное это массовая рассылка токенов, в конце ICO инвесторам, тут идет запись данных в блокчейн, очень по итогу дорогая операция
Я думаю это потому, что у вас изначально не определено количество дольщиков parts.length. Поэтому не возможно изначально расчитать количество газа на все переводы токенов. Спасибо, вроде очевидно, а не увидели этот момент. Но не совсем понятно как в Solidity задавать массивы? Ни где не нашел инфу об этом? Я встречал вот такую конструкцию в контракте StandardToken contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) allowed; ... Потом этот allowed используют так: allowed[msg.sender][_spender] = _value; Это двумерный массив. Однако с большими объемами не советую связываться. Действительно потом нужно будет много газа на обработку транзакции. Есть в ютубе видеолекция хорошая по поводу распределения памяти при записи транзакции в блокчейн. Там много полезного рассказывается, что нужно хранить, что не нужно. А самое главное, сколько это стоит! Хотите, я найду ссылку.
|
|
|
|
YYY2006
Newbie
Offline
Activity: 13
Merit: 0
|
|
July 11, 2018, 02:30:20 PM |
|
еще вопросик, все делаю по этой инструкции про пять минут это кончено бред какой то) уже третий день ковыряюсь, дошел до пункта после этой команды выскакивает ошибка https://i.imgur.com/uHGpXdt.jpgя так понимаю что проблема в truffle.js та мнадо прописать настройки сети а вот где бы их взять вот так пробовал все равно ошибка: module.exports = { networks: { localhost: { host: "localhost", port: 8545, network_id: "*" }, ropsten: { host: "localhost", port: 8545, gas: 4700000, gasPrice: 1000000000, network_id: "1" } } }; С такой настройкой трюфеля используется тестовая сеть ropsten. На сколько я знаю, Mist поднимает у себя на локалке ноду ropsten автоматически. Просто загружаете кошелек, подключаете его к тестовой сети ropsten и ждете. Кошелек синхронизируется с общим блокчейном, о чем он показывает на экране о процессе загрузки блоков. После окончания синхронизации вы подключаетесь через tryffle по licalhost:8545 Есть еще вариант через geth поднять ноду, на rinkeby это просто: Для быстрой синхронизации нужно использовать ключ -fast Эта ошибка у вас вылазит потому, что не включен ни кошелек, ни geth, ничего.
|
|
|
|
neHcuoHep
Newbie
Offline
Activity: 61
Merit: 0
|
|
July 12, 2018, 08:31:38 AM |
|
С такой настройкой трюфеля используется тестовая сеть ropsten. На сколько я знаю, Mist поднимает у себя на локалке ноду ropsten автоматически. Просто загружаете кошелек, подключаете его к тестовой сети ropsten и ждете. Кошелек синхронизируется с общим блокчейном, о чем он показывает на экране о процессе загрузки блоков. После окончания синхронизации вы подключаетесь через tryffle по licalhost:8545 Есть еще вариант через geth поднять ноду, на rinkeby это просто: Для быстрой синхронизации нужно использовать ключ -fast Эта ошибка у вас вылазит потому, что не включен ни кошелек, ни geth, ничего. может я конечно что то не догоняю ибо я не очень то программист немножко шарю в php,html,css но в testrpc вроде как кошелек включен по умолчанию, если я правильно понял автора: В testrpc, как правило, аккаунты создаются сразу при запуске и они сразу же разлочиваются; однако на тестовом и реальном блокчейне эфира стоит создать аккаунт через personal.newAccount() — дальше пополнить этот адрес через Faucet на тестовом блокчейне или реальным кефиром на реальном блокчейне. Не теряйте пароль и приватные ключи. я же запускаю testrpc и он сразу показывает несколько кошельков, если не сложно взгляни на статью и подскажи что я делаю не так
|
|
|
|
YYY2006
Newbie
Offline
Activity: 13
Merit: 0
|
|
July 12, 2018, 12:18:12 PM |
|
С testrpc должно работать. У меня работало все с таким truffle.js module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*", // Match any network id gas: 4600000 } } }; Хотя ругается на объект 'module'. Попробуй такую конфигурацию, может сработает.
|
|
|
|
neHcuoHep
Newbie
Offline
Activity: 61
Merit: 0
|
|
July 12, 2018, 12:27:39 PM |
|
С testrpc должно работать. У меня работало все с таким truffle.js module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*", // Match any network id gas: 4600000 } } }; Хотя ругается на объект 'module'. Попробуй такую конфигурацию, может сработает. неа( не проканало, та же ошибка
|
|
|
|
YYY2006
Newbie
Offline
Activity: 13
Merit: 0
|
|
July 12, 2018, 01:44:53 PM |
|
С testrpc должно работать. У меня работало все с таким truffle.js module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*", // Match any network id gas: 4600000 } } }; Хотя ругается на объект 'module'. Попробуй такую конфигурацию, может сработает. неа( не проканало, та же ошибка Погуглил немного, народ пишет, что сообщение 800A1391 может возникать из-за ошибок в окружении. Т.е. ошибки JavaScript, NodeJS и т.п. Даже пишут про ошибки в реестре Windows, хотя мне с трудом верится. Может стоит в эту сторону копнуть. Посмотреть версии, может чего-то обновить. А может все с начала попробовать поставить, как в этой статье написано. На рисунке светится скрипт 1_inital_maigration.js. И красным выделены строки с 13 по 15. В них видно глубоко вложенные колбэки: return deployer .then(() => { return deployer.deploy(token); })... Может и на этом скрипт валится. Попробуйте упростить деплой module.exports = function(deployer) { deployer.deploy(token); };
Если отработает, то уже дальше копать.
|
|
|
|
Mr.Kurh5
Jr. Member
Offline
Activity: 39
Merit: 1
|
|
July 16, 2018, 04:33:23 PM |
|
а зачем вы вообще его пишите? что за проект и как юридически он будет регулироваться?
|
|
|
|
|