Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
3 марта 2011, 12:49:34 PM   # 1
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Это позволит решить кучу проблем.

Почему бы не просто вернуть int64 и пусть клиент брось к поплавку & разделить 10 ^ 8 для отображения?

В настоящее время, так как JSON RPC возвращает поплавки, любая библиотека вы используете, будет возвращать значения как поплавки, а не строки. Таким образом, чтобы получить значение int64 вам нужно умножить поплавок на 10 ^ 8 и бросок к междунар для внутреннего использования.

Кроме того, возвращая значение как int64, будет соблюдение надлежащей практики на клиентах вместо них невольно с помощью поплавков.
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix


Как заработать Биткоины?
Без вложений. Не майнинг.


3 марта 2011, 1:15:26 PM   # 2
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Получил 1806 Биткоинов
Реальная история.





Поскольку JavaScript не имеет 64-битный целочисленный тип (все числа в JavaScript являются двойной точности с плавающей точкой).
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

3 марта 2011, 1:23:16 PM   # 3
 
 
Сообщения: 826
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

все числа в JavaScript являются двойной точности с плавающей точкой
К счастью для Bitcoin, двойной точности с плавающей запятой представляет целые числа в точности до 9,007,199,254,740,992, которая выше количества Bitcoin базовых блоков, т.е. 2,100,000,000,000,000.
ribuck сейчас офлайн Пожаловаться на ribuck   Ответить с цитированием Мультицитирование сообщения от ribuck Быстрый ответ на сообщение ribuck

3 марта 2011, 1:33:48 PM   # 4
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Разве мы не можем победить эту дохлую лошадь?

Я думаю, что есть гораздо более важные вещи, чтобы работать на / беспокоиться о чем или нет "отправить 1 BTC" выражается как "sendtoaddress FOO 1,00" или "sendtoaddress FOO 100000000" в JSON-RPC.

Как насчет того, чтобы (я начну) написать "Собственные деньги Handling" страница Вики, которая обсуждает этот вопрос и дает пример кода, как конвертировать в / из JSON двойной точности с плавающей точкой и 64-разрядного целого числа?
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

3 марта 2011, 2:17:12 PM   # 5
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Python использует поплавки для его библиотеки в формате JSON. В этом и заключается проблемы.

$ питон
>>> импорт JSON
>>> json.dumps (10.001)
'10 +0,000999999999999'
>>> json.loads ( '{"Blaa": 0.333331} ')
{U'blaa ': +0,33333099999999999}
>>> типа (json.loads ( '{"Blaa": 0.333331} ') [' Blaa '])
<типа «Поплавок»>

Это неприемлемо.
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

3 марта 2011, 2:33:21 PM   # 6
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Вики-страница, созданная:  https://en.bitcoin.it/wiki/Proper_Money_Handling_(JSON-RPC)

genjix: Вы должны называть json.loads (..., parse_float = decimal.Decimal) и использовать пользовательский класс JSON кодировщика для преобразования десятичных знаков в строки JSON без потери точности ...
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

3 марта 2011, 2:43:17 PM   # 7
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Да, только заметил, что.

Но тогда библиотека JSON-RPC Python не делает и я не мог найти для библиотеки PHP RPC либо.

Код:
>>> от jsonrpc импорта ServiceProxy
>>> Доступ = ServiceProxy ("HTTP: // пользователь: password@127.0.0.1: 8332")
>>> Тип (access.getbalance ())
<типа «Поплавок»>

Кстати, в этой вики страницы почему вы используете эти лямбды вместо того, чтобы просто используя decimal.Decimal? Умножив е8 заставит все как номера версии или сложности должны быть умножены.
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

3 марта 2011, 2:54:55 PM   # 8
 
 
Сообщения: 2282
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

В настоящее время, так как JSON RPC возвращает поплавки, любая библиотека вы используете, будет возвращать значения как поплавки, а не строки. Таким образом, чтобы получить значение int64 вам нужно умножить поплавок на 10 ^ 8 и бросок к междунар для внутреннего использования.
Это один из многих JSON-RPC недостатков дизайна. Вместо того, чтобы пытаться это исправить, я перешел к работе над новым протоколом для решения все проблемы: https://www.bitcoin.org/smf/index.php?topic=3757.0
Люк-младший сейчас офлайн Пожаловаться на Luke-Jr   Ответить с цитированием Мультицитирование сообщения от Luke-Jr Быстрый ответ на сообщение Luke-Jr

3 марта 2011, 3:26:16 PM   # 9
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

genjix: вот как сделать это правильно в python2.6:

Код:

импорт десятичное
импорт JSON

# От http://stackoverflow.com/questions/1960516/python-json-serialize-a-decimal-object
Класс DecimalEncoder (json.JSONEncoder):
  Защиту _iterencode (я, о, маркеры = None):
    если isinstance (о, decimal.Decimal):
      Возвращение (ул (о) для о в [о])
    вернуться супер (DecimalEncoder, самость) ._ iterencode (о, маркеры)

decimal.setcontext (decimal.Context (Prec = 8))

печать json.dumps (decimal.Decimal ('10 .001' ), ЦБС = DecimalEncoder)
печать json.dumps ({ "десятичная дробь" : Decimal.Decimal ( '1,1'), "поплавок" : 1.1, "строка" : "1,1" }, ЦБС = DecimalEncoder)
печать json.loads ( '{"Blaa": 0.333331}», parse_float = decimal.Decimal)
Производит вывод:
Код:
10,001
{"десятичная дробь": 1.1, "поплавок": 1,1000000000000001, "строка": "1,1"}
{U'blaa ': Десятичный (' 0,333331' )}

Обратите внимание, что даже если вы ПРОШЛИ «неправильную» строку в Bitcoin, Bitcoin будет делать правильные вещи. То есть, эти два эквивалентны, когда они разбираются Bitcoin:
Код:
sendtoaddress FOO +10,000999999999999
sendtoaddress FOO 10,001
... потому что Bitcoin делает правильное округление.

На Bitcoin стороны, это не проблема. А если код на другом конце соединения JSON-RPC делает неправильные вещи (обрежут значения как 10.000999999999999 вместо округления их до ближайшей 8'th знака после запятой), то это ошибка в этом коде.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

3 марта 2011, 3:34:56 PM   # 10
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Вот код для разбора JSONs. Там есть библиотека Python для работы с JSON-RPC. Там же PHP библиотека сделать JSON-RPC. Оба используют поплавки.

Раствор А: все, что хочет взаимодействовать с Bitcoin в Python / PHP должен написать свой собственный (потенциально глючный) RPC HTTP код, потому что ЛИЭС по умолчанию для этих языков используются поплавки.
Раствор В: небольшое изменение сделано в Bitcoin.

B является гораздо лучшим решением
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

3 марта 2011, 8:06:34 PM   # 11
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Вот код для разбора JSONs. Там есть библиотека Python для работы с JSON-RPC.
А? Смотрите, что заявление «импорт JSon» в верхней? Это было бы стандартом (по состоянию на Python 2.6) JSON синтаксического анализа библиотеки.

Код, который я отправил говорит стандартный формат JSON синтаксического анализа библиотеки для чтения JSON номера в десятичном. Если вы делаете денежные расчеты в питоне, то вы должны использовать Десятичный. Это то, что это для.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

3 марта 2011, 9:37:28 PM   # 12
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Вот код для разбора JSONs. Там есть библиотека Python для работы с JSON-RPC.
А? Смотрите, что заявление «импорт JSon» в верхней? Это было бы стандартом (по состоянию на Python 2.6) JSON синтаксического анализа библиотеки.

Код, который я отправил говорит стандартный формат JSON синтаксического анализа библиотеки для чтения JSON номера в десятичном. Если вы делаете денежные расчеты в питоне, то вы должны использовать Десятичный. Это то, что это для.


Не JSON, но JSON-RPC, как рекомендовано JSON-RPC себя.
http://json-rpc.org/wiki/python-json-rpc
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

11 марта 2011, 8:53:38 PM   # 13
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Это упрямство ... Теперь я пытаюсь интегрировать Bitcoin на веб-сайт, но библиотека JSON-RPC возвращает только поплавки.

котировка
Числа с плавающей точкой имеют ограниченную точность. Хотя это зависит от системы, как правило, РНР использует формат двойной точности стандарта IEEE 754, который даст максимальную относительную погрешность из-за округления в порядке 1.11e-16. Номера элементарные арифметические операции могут давать большие ошибки, и, конечно же, progragation ошибки необходимо учитывать при нескольких операций усугубляются.

Кроме того, рациональные числа, которые точно представима в виде чисел с плавающей точкой в ​​основании 10, как 0.1 или 0.7, не имеют точного представления, как числа с плавающей запятой в базе 2, которая не используется внутри, независимо от размера мантиссы. Следовательно, они не могут быть преобразованы в свои внутренние двоичные аналоги без небольшой потери точности. Это может привести к неожиданным результатам: например, пол ((0,1 + 0,7) * 10), как правило, возвращают 7 вместо ожидаемого 8, так как внутреннее представление будет что-то вроде 7.9999999999999991118 ....

Так никогда не доверять плавающие результаты номерных к последней цифре, и никогда не сравнивают числа с плавающей точкой на равенство. Если более высокая точность, необходимо, произвольные точности математические функции и функции доступны GMP.

Почему не может Bitcoin возвращаемых строк?

Вы сознательно нарушая все языки (библиотеки питона JSON-RPC, PHP JSON-RPC и Perl JSON-RPC). Использование поплавков в любом месте в финансовых операциях, является неприемлемым.

json_decode PHP не поддерживает так или иначе вернуть поплавки в виде строк. Опция не существует.
PHP решение: написать / сохранить свой собственный JSON парсер.

Ни делает Питон JSON-RPC. Придется написать свой собственный JSON-RPC Lib, используя модуль JSON вместо того, чтобы использовать тот, который уже существует.

То же самое для Perl.

На самом деле, почему это такое большое дело? Bitcoin нарушается, и это требует фиксации.
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

11 марта 2011, 9:17:22 PM   # 14
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

PHP решение: написать / сохранить свой собственный JSON парсер.

Почему вы не можете просто умножить число на 1.0e8 и затем округляется до ближайшего целого числа? Это целое ВСЕГДА БУДЕТ ТОЧНО RIGHT (предполагая, что вы не используете PHP на некоторые действительно странные аппаратных средств).

Согласно PHP инструкции:
котировка
Размер поплавка зависит от платформы, хотя максимум, ~ 1.8e308 с точностью около 14 десятичных цифр является общим значением (64 бит IEEE формат).

Я добавил библиотеки пример Python JSON-RPC на Собственные деньги Handling вики-страницы.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

11 марта 2011, 9:19:46 PM   # 15
 
 
Сообщения: 1470
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Это упрямство ... Теперь я пытаюсь интегрировать Bitcoin на веб-сайт, но библиотека JSON-RPC возвращает только поплавки.

Почему не может Bitcoin возвращаемых строк?

+ 1
Поплавки царственное боль в заднице. Каждый банк приложений программист, вероятно, сказать вам, что.
Особенно RPC-подобные услуги должны работать со строками - это делает много вещей проще и позволяет бесконечной точности.

Согласно PHP инструкции:
котировка
Размер поплавка зависит от платформы, хотя максимум, ~ 1.8e308 с точностью около 14 десятичных цифр является общим значением (64 бит IEEE формат).

Для операций крайней точности, PHP имеет множество наборов математических библиотек, которые также работают со строками, а не поплавки.

Так, например, BC-Math или GMP.

http://php.net/manual/en/book.bc.php
http://www.php.net/manual/en/book.gmp.php
ShadowOfHarbringer сейчас офлайн Пожаловаться на ShadowOfHarbringer   Ответить с цитированием Мультицитирование сообщения от ShadowOfHarbringer Быстрый ответ на сообщение ShadowOfHarbringer

11 марта 2011, 9:33:09 PM   # 16
 
 
Сообщения: 1470
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Еще кое-что:

Кроме того, я думаю, что в PHP, результат поплавка <-> целочисленные расчеты могут отличаться на 32- & 64-битные платформы, однако я могу ошибаться (и я слишком ленив, чтобы проверить с помощью Google).

Там могут быть некоторые ошибки или PHP конкретных "функции" участвует.
ShadowOfHarbringer сейчас офлайн Пожаловаться на ShadowOfHarbringer   Ответить с цитированием Мультицитирование сообщения от ShadowOfHarbringer Быстрый ответ на сообщение ShadowOfHarbringer

11 марта 2011, 10:00:55 PM   # 17
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

ShadowOfHarbringer: Вы знаете, как делить числа в PHP GMP и получить десятичное число (не фактор + остаточный)?
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

11 марта 2011, 10:12:47 PM   # 18
 
 
Сообщения: 1470
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

ShadowOfHarbringer: Вы знаете, как делить числа в PHP GMP и получить десятичное число (не фактор + остаточный)?

Ну это должно быть довольно легко с помощью GMP, однако я никогда не делал этого раньше.

Вы, вероятно, необходимо изучить использование следующих функций:

http://www.php.net/manual/en/function.gmp-init.php
http://www.php.net/manual/en/function.gmp-div-q.php
http://www.php.net/manual/en/function.gmp-strval.php

Пример из PHP.net:

Код:

$ div1 
знак равно gmp_div_q("100""5");
эхо 
gmp_strval($ div1). «\ П»;

$ div2 знак равно gmp_div_q("1""3");
эхо 
gmp_strval($ div2). «\ П»;

$ div3 знак равно gmp_div_q("1""3"GMP_ROUND_PLUSINF);
эхо 
gmp_strval($ div3). «\ П»;

$ div4 знак равно gmp_div_q("-1""4"GMP_ROUND_PLUSINF);
эхо 
gmp_strval($ div4). «\ П»;

$ div5 знак равно gmp_div_q("-1""4"GMP_ROUND_MINUSINF);
эхо 
gmp_strval($ div5). «\ П»;

И результат:

Код:
20
0
1
0
-1
ShadowOfHarbringer сейчас офлайн Пожаловаться на ShadowOfHarbringer   Ответить с цитированием Мультицитирование сообщения от ShadowOfHarbringer Быстрый ответ на сообщение ShadowOfHarbringer

11 марта 2011, 10:35:33 PM   # 19
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Да те, целые значения,

var_dump (gmp_strval (gmp_div_q (gmp_init ("5"), Gmp_init ("2"))));

вывод:
Строка (1) "2" 

Вот мое решение, http://codepad.viper-7.com/tbZ9oD
Код:

$ Quot 
знак равно gmp_init("5");
$ ОКО знак равно gmp_init("2");
# Количество знаков после запятой
$ точность знак равно 2;

$ сдвига знак равно gmp_pow("10"$ точность);
$ Quot знак равно gmp_mul($ Quot$ сдвига);

$ Рез знак равно gmp_div_q($ Quot$ ОКО);
$ магнезии знак равно gmp_strval($ Рез);
$ dotpos знак равно StrLen($ магнезии) - $ точность;
$ магнезии знак равно зиЬзЬг($ магнезии0$ dotpos). "" зиЬзЬг($ магнезии$ dotpos);

эхо 
«Число: $ магнезии";
$ Рез знак равно gmp_init($ магнезии);

Умножить фактор на 10 ^ р (р = точность), выполнить целочисленное деление, преобразование в строку, вставить десятичную точку, преобразовать обратно в GMP.
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

11 марта 2011, 10:51:31 PM   # 20
 
 
Сообщения: 1470
Цитировать по имени
цитировать ответ
по умолчанию Re: почему значения JSON RPC не использовать int64 вместо поплавка строки?

Да те, целые значения,

var_dump (gmp_strval (gmp_div_q (gmp_init ("5"), Gmp_init ("2"))));

вывод:
Строка (1) "2" 

Вот мое решение, http://codepad.viper-7.com/tbZ9oD
Код:

$ Quot 
знак равно gmp_init("5");
$ ОКО знак равно gmp_init("2");
# Количество знаков после запятой
$ точность знак равно 2;

$ сдвига знак равно gmp_pow("10"$ точность);
$ Quot знак равно gmp_mul($ Quot$ сдвига);

$ Рез знак равно gmp_div_q($ Quot$ ОКО);
$ магнезии знак равно gmp_strval($ Рез);
$ dotpos знак равно StrLen($ магнезии) - $ точность;
$ магнезии знак равно зиЬзЬг($ магнезии0$ dotpos). "" зиЬзЬг($ магнезии$ dotpos);

эхо 
«Число: $ магнезии";
$ Рез знак равно gmp_init($ магнезии);

Умножить фактор на 10 ^ р (р = точность), выполнить целочисленное деление, преобразование в строку, вставить десятичную точку, преобразовать обратно в GMP.

Разве вы не можете сделать все из этого Iside GMP (ресурсы)?
Это будет гораздо быстрее, чем работает на струнах.

Перемещение десятичной точки должно быть возможно внутри GMP.
ShadowOfHarbringer сейчас офлайн Пожаловаться на ShadowOfHarbringer   Ответить с цитированием Мультицитирование сообщения от ShadowOfHarbringer Быстрый ответ на сообщение ShadowOfHarbringer



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW