static function getMrklroot($binary_data, $variables, $first = false) { if ($first) { debug_print('$first=true', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } $tx_size = 0; // [error] парсим после вызова функции if ($binary_data) { debug_print('$binary_data=' . bin2hex($binary_data) . "\nstrlen=" . strlen($binary_data), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); do { // чтобы исключить атаку на переполнение памяти, выделенной для php if (!$first) { if ($tx_size > $variables['max_tx_size']) { return '[error] MAX_TX_SIZE'; } } $tx_size = self::decode_length($binary_data); //print '$tx_size='.$tx_size."\n"; // отчекрыжим одну транзакцию от списка транзакций if ($tx_size) { $transaction_binary_data = self::string_shift($binary_data, $tx_size); $mrkl_array[] = self::dsha256($transaction_binary_data); } ////print 'strle($transaction_data)='.strlen($transaction_binary_data)."\n"; ////print '($transaction_data)='.$transaction_binary_data."\n"; //print_r($mrkl_array); // чтобы исключить атаку на переполнение памяти, выделенной для php if (!$first) { if (sizeof($mrkl_array) > $variables['max_tx_count']) { return '[error] MAX_TX_COUNT'; } } } while ($binary_data); } else { $mrkl_array[] = 0; } debug_print('$mrkl_array:' . print_r_hex($mrkl_array), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return testblock::merkle_tree_root($mrkl_array); }