Предположим, вы хотите, чтобы ваш контракт EOS принимал платежи только на точную определенную сумму. Затем, конечно, вам нужно будет вывести желаемую сумму в eosio_assert()
, чтобы плательщик понял, какая сумма ожидается. Но eosiolib
, библиотека всех стандартных инструментов для построения контракта, не предоставляет функции, которая просто генерирует строку из объекта asset
.
Вы можете попробовать использовать для этого sprintf()
, но вскоре вы обнаружите, что он добавляет около 20 КБ к вашему двоичному файлу, что приводит к дополнительному использованию 200 КБ ОЗУ при загрузке контракта в сеть. В текущих ценах это примерно 200 долларов США.
Итак, я написал этот фрагмент кода, чтобы смягчить эту проблему:
if( payment != exactprice ) { int64_t pres = (int64_t)exactprice.symbol.precision(); char buf[64]; char* start = buf + sizeof(buf) - 10; char* end = start; int digits = 0; int64_t amount = exactprice.amount; while( amount != 0 || digits < pres+1 ) { --start; *start = (amount % 10) + '0'; digits++; if( digits == pres ) { *--start = '.'; } amount /= 10; } *end++ = ' '; auto sym = exactprice.symbol.name(); for( int i = 0; i < 7; ++i ) { char c = (char)(sym & 0xff); *end++ = c; if( c == 0 ) break; sym >>= 8; } *end = 0; char str[256] = "Incorrect payment amount. Expected "; strcat(str, start); eosio_assert(0, str); }
Некоторым из вас, возможно, понравится вернуться к базовым заданиям в классе информатики :)