Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2021, 20:22   #1
cutter47
Пользователь
 
Регистрация: 22.06.2020
Сообщений: 23
По умолчанию Проблема с функцией

Здравствуйте уважаемые форумчане, столкнулся с проблемой такого плана:
В интернете нашел код проверки биткоин кошелька на валидность (проверка четырех байт двойного хеша HashSHA256 после обработки функции DecodeBase58), так вот именно та самая функция DecodeBase58 не дает скомпилировать программу. (Видимо писалось под Lazarus или что-то похожее)
В ней есть цикл, внутри которого изменяется переменнуя, которую в Delphi насколько я понимал менять внутри самого цикла нельзя.
На этих трех строках я и споткнулся.
Прошу вашей помощи в данном вопросе.
3 проблемных строки закомментированы в функции DecodeBase58.
Код:
unit ValidateBitcoinAddr;

interface

uses
  DCPsha256,SysUtils,dialogs;

type
  TByteArray = array of Byte;

const
  Size = 25;
  Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

procedure ValidateBitcoinAddress(const Address: string);

implementation


function HashSHA256(const Input: TByteArray): TByteArray;
var
  Hasher: TDCP_sha256;
begin
  Hasher := TDCP_sha256.Create(nil);
  try
    Hasher.Init;
    Hasher.Update(Input[0], Length(Input));
    SetLength(Result, Hasher.HashSize div 8);
    Hasher.Final(Result[0]);
  finally
    Hasher.Free;
  end;
end;


function DecodeBase58(const Input: string): TByteArray;
var
  C: Char;
  LenInput,I, J: Integer;
begin
  SetLength(Result, Size);
  LenInput:=length(Input);

  for I:= 1 to LenInput do
  begin
//  if Input[I] = C then I:= Pos(C, Alphabet) - 1;
    if I = -1 then raise Exception.CreateFmt('Invalid character found: %s', [C]);

    for J := High(Result) downto 0 do
    begin
//  I := I + (58 * Result[J]);
      Result[J] := I mod 256;
//  I := I div 256;
    end;
    if I <> 0 then raise Exception.Create('Address too long');
  end;
end;

procedure ValidateBitcoinAddress(const Address: string);
var
  Hashed: TByteArray;
  Decoded: TByteArray;
begin
  if (Length(Address) < 25) or (Length(Address) > 34) then
    raise Exception.Create('Wrong length');

  Decoded := DecodeBase58(Address);
  Hashed := HashSHA256(HashSHA256(Copy(Decoded, 0, 21)));
  if not CompareMem(@Decoded[21], @Hashed[0], 4) then
    raise Exception.Create('Bad digest');
end;  


end.
...............
Код:
procedure TForm1.Button1Click(Sender: TObject);
 begin
  ValidateBitcoinAddress('1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9');
 end;
на PHP все прекрасно работает, вот результаты из PHP скрипта для примера:
1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9: OK
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i: OK
1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9: bad digest
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I: invalid character found

Каждому буду благодарен за любую помощь.
cutter47 вне форума Ответить с цитированием
Старый 23.01.2021, 20:12   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

А так работает?
Код:
function DecodeBase58(const Input: string): TByteArray;
var
  C: Char;
  I, J, K: Integer;
begin
  SetLength(Result, Size);

  for K:= 1 to length(Input) do
  begin
    C := Input[K];
    I := Pos(C, Alphabet) - 1;
    if I = -1 then raise Exception.CreateFmt('Invalid character found: %s', [C]);

    for J := High(Result) downto 0 do
    begin
      I := I + (58 * Result[J]);
      Result[J] := I mod 256;
      I := I div 256;
    end;

    if I <> 0 then raise Exception.Create('Address too long');
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 23.01.2021, 21:51   #3
cutter47
Пользователь
 
Регистрация: 22.06.2020
Сообщений: 23
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А так работает?
Код:
function DecodeBase58(const Input: string): TByteArray;
var
  C: Char;
  I, J, K: Integer;
begin
  SetLength(Result, Size);

  for K:= 1 to length(Input) do
  begin
    C := Input[K];
    I := Pos(C, Alphabet) - 1;
    if I = -1 then raise Exception.CreateFmt('Invalid character found: %s', [C]);

    for J := High(Result) downto 0 do
    begin
      I := I + (58 * Result[J]);
      Result[J] := I mod 256;
      I := I div 256;
    end;

    if I <> 0 then raise Exception.Create('Address too long');
  end;
end;
Да, спасибо огромное !!!! Много потратил времени сегодня, половину PHP изучил пока код переписывал с него.
Жаль плюсануть не нашел как в репутацию вам =(
Как я понял это Лазарус (на двиге, который FPL) или сам FPL, так как в Delphi никогда не видел чтоб данные самого цикла менялись внутри его самого (цикла).
Еще раз спасибо ! Может кому-то еще пригодится.

Последний раз редактировалось cutter47; 23.01.2021 в 22:23.
cutter47 вне форума Ответить с цитированием
Старый 24.01.2021, 05:26   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Пожалуйста. Если стало считать правильно, то, похоже, в изначально найденном коде были ошибки (C ничем не инициализирована, но сравнивается; I используется сразу для двух вещей, хотя не должен). В Си можно менять счетчик внутри "for" цикла, как в Лазарусе - не знаю.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.01.2021, 20:34   #5
cutter47
Пользователь
 
Регистрация: 22.06.2020
Сообщений: 23
По умолчанию

Спасибо большое за разъяснения !
cutter47 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с функцией VADYA12 Общие вопросы Delphi 5 11.03.2016 16:48
Проблема с функцией PaHaNjkee Общие вопросы Delphi 28 27.03.2014 19:53
проблема с функцией Madmaxisss Паскаль, Turbo Pascal, PascalABC.NET 5 23.08.2012 13:46
проблема с функцией Си blain Помощь студентам 1 19.02.2012 21:06
Проблема с функцией MeTeOpA C# (си шарп) 6 11.07.2011 00:07