За последние 24 часа нас посетил 10301 программист и 942 робота. Сейчас ищут 295 программистов ...

Не передает информацию из смарт контракта в базу данных

Тема в разделе "PHP и базы данных", создана пользователем fanis, 23 июн 2022.

  1. fanis

    fanis Гость

    С нами с:
    23 июн 2022
    Сообщения:
    1
    Симпатии:
    0
    Всем привет! Есть такой код, который должен брать информацию из смарт контракта BSC и добавлять строки в базу данных PHPMYADMIN. Не могу понять в чем дело, но регистрация в смарт контракте происходит, а в БД не добавляет строки.
    service.php
    Код:
    PHP:
    1. <?
    2.     defined('ROOT_DIR') or header('HTTP/1.1 404 Not Found') or header('Status: 404 Not Found') or die;
    3.  
    4.     $Db = module('db');
    5.     $web3api = module('web3api');
    6.     $Fetch = module('fetch');
    7.  
    8.     $this->contract = '';
    9.     $this->contract_deploy_block = 0;
    10.  
    11.     // Очистить базу от данных контракта
    12.     $this->clearBD = function() use(&$Db) {
    13.         if($this->contract_deploy_block != $Db->storage('syncWithContract.block')) {
    14.             $Db->storage('syncWithContract.block', $this->contract_deploy_block);
    15.             $Db->storage('syncWithContract.lastBlock', null);
    16.  
    17.             foreach(['users', 'users_levels', 'profits'] as $v) $Db->query("TRUNCATE `$v`");
    18.         }
    19.     };
    20.  
    21.     // Парсить лог
    22.     $this->parseLog = function($log) use(&$Db, &$web3api) {
    23.         $key = md5($log['transactionHash'].$log['logIndex']);
    24.         $data = array_map('hexdec', $web3api->parseData($log['data']));
    25.         $block = $web3api->api('eth_getBlockByHash', [$log['blockHash'], false]);
    26.         $time = hexdec($block['timestamp']);
    27.  
    28.           // event Register(address indexed addr, address indexed inviter, uint256 id);
    29.         if($log['topics'][0] == '0xcc0bec1447060c88cdc5a739cf29cfa26c453574dd3f5b9e4dcc317d6401cb1c') {
    30.             if(!$Db->val("SELECT `id` FROM `users` WHERE `addr` = ?", ['0x'.substr($log['topics'][1], 26)])) {
    31.                 $Db->insert('users', [
    32.                     'id' => $data[0],
    33.                     'parent_id' => $Db->val("SELECT `id` FROM `users` WHERE `addr` = ?", ['0x'.substr($log['topics'][2], 26)]),
    34.                     'time_add' => $time,
    35.                     'addr' => '0x'.substr($log['topics'][1], 26)
    36.                 ]);
    37.             }
    38.         }
    39.         // event BuyLevel(address indexed addr, address indexed upline, uint8 level, uint40 expires);
    40.         else if($log['topics'][0] == '0xa931ae1a242aa90f4b50bb7ca26c1da1f3aa69f4e75468b217d9e1b9d8a6fc13') {
    41.             $Db->insert('users_levels', [
    42.                 'key' => $key,
    43.                 'user_id' => $Db->val("SELECT `id` FROM `users` WHERE `addr` = ?", ['0x'.substr($log['topics'][1], 26)]),
    44.                 'parent_id' => $Db->val("SELECT `id` FROM `users` WHERE `addr` = ?", ['0x'.substr($log['topics'][2], 26)]),
    45.                 'level_id' => $data[0] + 1,
    46.                 'time_add' => $time,
    47.                 'time_expires' => $data[1],
    48.                 'amount' => $Db->val("SELECT `price` FROM `levels` WHERE `id` = ?", [$data[0] + 1])
    49.             ]);
    50.         }
    51.         // event Profit(address indexed addr, address indexed referral, uint256 value);
    52.         // event Lost(address indexed addr, address indexed referral, uint256 value);
    53.         else if(
    54.             $log['topics'][0] == '0x927ca72beeafa042127c9b97483d6b6f5ada2790237a7b3310232cab8888ac27'
    55.             || $log['topics'][0] == '0xb38c5ffc8559f83ecf23d55719cd798bf510f15e45ad81bdc0b0026fa9d7311f'
    56.         ) {
    57.             $value = round($data[0] / 1e18, 2);
    58.  
    59.             $Db->insert('profits', [
    60.                 'key' => $key,
    61.                 'user_id' => $Db->val("SELECT `id` FROM `users` WHERE `addr` = ?", ['0x'.substr($log['topics'][1], 26)]),
    62.                 'level_id' => $Db->val("SELECT `id` FROM `levels` WHERE `price` >= ? ORDER BY price ASC LIMIT 1", [$value]),
    63.                 'referral_id' => $Db->val("SELECT `id` FROM `users` WHERE `addr` = ?", ['0x'.substr($log['topics'][2], 26)]),
    64.                 'time_add' => $time,
    65.                 'lost' => $log['topics'][0] == '0xb38c5ffc8559f83ecf23d55719cd798bf510f15e45ad81bdc0b0026fa9d7311f' ? 1 : 0,
    66.                 'amount' => $value
    67.             ]);
    68.         }
    69.     };
    70.  
    71.     // Получить рейтинги валют в USD
    72.     $this->getRates = function() use(&$Db, &$Fetch) {
    73.         if(!($rates = $Db->storage('sc.gateway.api:rates'))) {
    74.             $Db->storage('sc.gateway.api:rates', ($rates = json_decode($Fetch->query('https://api.smartcontract.ru/gateway/rates_usd.json')['body'], true)['data']), time() + 600);
    75.         }
    76.  
    77.         return $rates;
    78.     };
    79.  
    80.     // Синхронизироваться с смартконтрактом
    81.     $this->syncWithContract = function($App, $data = null) use(&$Db, &$web3api) {
    82.         if($App->params['tx']) {
    83.             try {
    84.                 $tx = $web3api->api('eth_getTransactionReceipt', [$App->params['tx']]);
    85.  
    86.                 foreach((array)$tx['logs'] as $log) $this->parseLog($log);
    87.  
    88.                 $App->json(['status' => !!hexdec($tx['status'])]);
    89.             }
    90.             catch(Exception $e) {
    91.                 $App->json(['status' => false]);
    92.             }
    93.         }
    94.         else {
    95.             $this->clearBD();
    96.  
    97.             $block = (int)$Db->storage('syncWithContract.lastBlock') ?: $this->contract_deploy_block;
    98.          
    99.             try {
    100.                 foreach($web3api->getLogs($this->contract, '0x'.dechex($block - 0), [], '0x'.dechex($block + 100000)) as $log) {
    101.                     if(($b = hexdec(substr($log['blockNumber'], 0))) > $block) {
    102.                         $block = $b;
    103.                     }
    104.  
    105.                     $this->parseLog($log);
    106.                 }
    107.  
    108.                 $Db->storage('syncWithContract.lastBlock', $block);
    109.             }
    110.             catch(Exception $e) {
    111.                 $Db->storage('syncWithContract.error', $e->getMessage(), time());
    112.             }
    113.         }
    114.     };
    Может в других кодах проблема, не могу понять. Помогите, пожалуйста!

    Вставляй код кнопкой </>
     
    #1 fanis, 23 июн 2022
    Последнее редактирование модератором: 23 июн 2022
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.441
    Симпатии:
    1.249
    Адрес:
    Лень
    за вас надо понять ?
    --- Добавлено ---
    Опишите проблему в коде