Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
22 июня 2012, 1:02:12 PM   # 1
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: SQL блок базы данных: о вложенных наборов

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


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

Как я пытаюсь внедрить SQL Bitcoin базы данных для моего библиотека Perl, я искал способ эффективно хранить структуру дерева блоков. Так я узнал об идее, которая вроде опрятно: вложенности множеств.

Вот один документ, который объясняет его (это не один я на самом деле используется в качестве одного я использовал не на английском, так что я должен был найти другой для вас): https://communities.bmc.com/communities/docs / DOC-9902

EDIT: википедия страница кажется, тоже хорошо.


Я думаю, что это довольно метод тесак, но немного трудно понять.

Вот MySQL код, который я написал до сих пор (я не ставил здесь какие-то взгляды, но я поставил основные таблицы, даже если они не относятся к предмету данной теме):

Код:
-- Таблица "блоки" на самом деле содержит только блок заголовков
CREATE TABLE блоки (
    хэш-символ (32) двоичный первичный ключ,

    версия целое число по умолчанию 1,
    hashPrev символ (32) двоичный не нулевой,
    hashMerkleRoot символ (32), не двоичная нуль,
    NTime целое число без знака не равно нулю,
    Nbits целое число без знака не равно нулю,
    nNonce целое число без знака не равно нулю,

    ключ (hashMerkleRoot),
    ключ (hashPrev)
);

-- Мы вставить блок генезиса здесь некоторые триггера не будут вести себя хорошо
-- с таблицей пустых "блоками.
INSERT INTO значений блоков (
    unhex ("6FE28C0AB6F1B372C1A6A246AE63F74F931E8365E15A089C68D6190000000000"),

    1,
    unhex ("0000000000000000000000000000000000000000000000000000000000000000"),
    unhex ("3BA3EDFD7A7B12B27AC72C3E67768F617FC81BC3888A51323A9FB8AA4B1E5E4A"),
    1231006505,
    486604799,
    2083236893
);

-- Вид бесхозных блоков
-- (Обратите внимание, что мы не используем любые "Посмотреть" Приставка в названии здесь)
CREATE VIEW orphan_blocks AS
Выберите.*
ОТ блокирует LEFT JOIN блоки б
ON a.hashPrev = b.hash
ГДЕ b.hash IS NULL;

-- Меркл транзакционных дерева хранятся в их собственной таблице
CREATE TABLE Merkle_trees (
    Корневой символ (32) двоичная не нулевые,
    IDX целое число без знака не равно нулю,
    гашиш символ (32) двоичные,
    Первичный ключ (корень, IDX),
    ключ (корень)
);

-- операции
CREATE TABLE операций (
    хэш-символ (32) двоичный первичный ключ,
    версия целое число,
    Locktime целое число без знака,
);

-- входы транзакций
CREATE TABLE tx_in (
    хэш-символ (32) двоичной,
    prevout_hash символ (32) двоичной,
    prevout_n целое число без знака,
    scriptSig блоб,
    Последовательность целое число без знака,

    Первичный ключ (хэш, prevout_hash, prevout_n),
    Ключ (хэш)
)

-- выходы транзакций
CREATE TABLE tx_out (
    tx_out_id целое число без знака первичного ключа auto_increment,
    хэш-символ (32) двоичной,
    целое значение,
    scriptPubKey блоб,

    Ключ (хэш)
);

-- Функция для вычисления цели из Nbits
CREATE целевой функции (биты с плавающей точкой)
ВОЗВРАТ РЕАЛ DETERMINISTIC
ВОЗВРАТ моды (биты, 0x1000000) * пау (256, биты Дива 0x1000000 - 3);

-- Для того, чтобы создать структуру блока дерева,
-- мы будем использовать модель интервала.
-- Каждый узел (т.е. каждый блок) будет иметь левый
-- и правый край. Мы должны обеспечить, чтобы по убыванию
-- блоки имеют края внутри краев своего родителя.

CREATE TABLE block_tree (
    узел символ (32) двоичный первичный ключ,
    L целое число без знака не равно нулю,
    р целое число без знака не нулевой чек (R > Л),
    высота целое число без знака не нуль
);

-- Вставляем узел генезис вручную.
-- Левый край 0, правый край 1, высота 0.
INSERT INTO значений block_tree (
    unhex ("6FE28C0AB6F1B372C1A6A246AE63F74F931E8365E15A089C68D6190000000000"),
    0,
    1,
    0
);

CREATE TRIGGER add_block_in_tree ПОСЛЕ INSERT ON блоков
ДЛЯ КАЖДОЙ ROW
НАЧАТЬ
    ОБНОВЛЕНИЕ block_tree т, block_tree г
    SET t.L = t.L + 2
    ГДЕ r.node = new.hashPrev
    И t.L >= R.D;

    ОБНОВЛЕНИЕ block_tree т, block_tree г
    SET t.D = t.D + 2
    ГДЕ r.node = new.hashPrev
    И t.D >= R.D;

    INSERT INTO block_tree (узел, L, R, высота)
    ВЫБОР new.hash, r.D, r.D + 1, + 1 r.height
    ОТ block_tree г
    Где r.node = new.hashPrev;
КОНЕЦ;

Курок "add_block_in_tree" должен работать, когда блок, родитель которого, как известно вставляется. Но это не будет работать, если блок вставляется перед его родителем. Должна быть обеспечена возможность закодировать это, но это немного сложнее.

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


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


22 июня 2012, 3:08:59 PM   # 2
 
 
Сообщения: 253
Цитировать по имени
цитировать ответ
по умолчанию Re: SQL блок базы данных: о вложенных наборов

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





Я регулярно использовать вложенную модель множества деревьев в SQL для моей повседневной работе (которая не имеет никакого отношения к Bitcoin). Я думаю, что Джо Селко был один из создателей (или, по крайней мере, адвокат) для использования SQL таким образом, и его книга "SQL для Smarties" это одна из лучших книг, которые я когда-либо использовал профессионально. Он обрабатывает много "умная" использует в SQL разнообразных вещей, в том числе вложенных множеств, и я очень рекомендую его.
ПК сейчас офлайн Пожаловаться на ПК   Ответить с цитированием Мультицитирование сообщения от рс Быстрый ответ на сообщение ПК

22 июня 2012, 5:20:13 PM   # 3
 
 
Сообщения: 905
Цитировать по имени
цитировать ответ
по умолчанию Re: SQL блок базы данных: о вложенных наборов

Я написал / улучшенный-на вложенный наборе реализации в Python, используя SQLAlchemy для этой точной цели. Это размещается на GitHub.

Это, вероятно, не стоит усилий, чтобы интегрировать его в вашу библиотеку PERL непосредственно (находясь в Python и поверх SQLAlchemy и т.д.), но вы можете порт, или, может быть, вы просто найти его полезным справочным как вам написать свой собственный.

EDIT: Я полагаю, что кодовая может быть пугающим для тех, кто не разбирается в Python или рамках SQLAlchemy. Вы найдете вставки / обновления / удаления кода в «sqlalchemy_tree / orm.py», а также методы более высокого уровня для манипулирования деревом в «sqlalchemy_tree / менеджер / {class_, например} .py».
maaku сейчас офлайн Пожаловаться на maaku   Ответить с цитированием Мультицитирование сообщения от maaku Быстрый ответ на сообщение maaku

27 июня 2012, 8:26:52 AM   # 4
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: SQL блок базы данных: о вложенных наборов

Я написал / улучшенный-на вложенный наборе реализации в Python, используя SQLAlchemy для этой точной цели. Это размещается на GitHub.

Это, вероятно, не стоит усилий, чтобы интегрировать его в вашу библиотеку PERL непосредственно (находясь в Python и поверх SQLAlchemy и т.д.), но вы можете порт, или, может быть, вы просто найти его полезным справочным как вам написать свой собственный.

EDIT: Я полагаю, что кодовая может быть пугающим для тех, кто не разбирается в Python или рамках SQLAlchemy. Вы найдете вставки / обновления / удаления кода в «sqlalchemy_tree / orm.py», а также методы более высокого уровня для манипулирования деревом в «sqlalchemy_tree / менеджер / {class_, например} .py».


Я буду смотреть на него когда-нибудь. Но пока я работал на аккуратные вещи, и я хотел бы поделиться им со всеми. Это не реализовано в SQL прямо сейчас, но я должен сделать это в ближайшее время.

Вот.

Я провел некоторое время, читая работу парня по имени Вадим Tropashko на
этот предмет. Это очень увлекательно, и я думаю, что его техника была бы
идеально подходит для SQL модели Bitcoin блочной структуры.

Tropashko использует рациональные значения в качестве границ для его интервалов. Один из главных
Преимуществом является то, что вы можете работать на исправление глобального интервала (от 0 до 1, например):
Вы не должны перекладывать половину блока дерева каждый раз, когда вы вставляете новый узел.

Один крутого аспектом этого метода является связью с дробями.
Как вы знаете, любая фракция может быть записана в виде конечной цепной дроби:

Код:
р 1     
- знак равно
д 1 
    а + -----------
               1
        Ь + -------
           
            с + ...

Идея заключается в том, что а, Ь, с, ... последовательность обеспечивает естественный путь для
филиал узла.

Так, например, последовательность, такие как 1, 1, 2, 1 будет означать:  "возьмите вторую ветвь
в третьем узле от корня",

Теперь, вложенные интервалы все о интервалах, поэтому мы не можем быть счастливы только с
один рациональный для каждого узла. Нам нужен верхний предел, при условии рационального
описанные выше, нижний предел (не necessarly случая, хотя, но
мы будем иметь дело с этой проблемой позже).

Идея заключается в том, чтобы связать функцию Mцbius с переменным й в диапазоне от 0 до 1
(Такой же, как наш глобальный интервал):

Код:
              1     
М (х) = ---------------
                1 
       а + -----------
                  1
           Ь + -------
   
               с + х

Тогда мы имеем P / Q = М (0). Родитель F / р, то М (бесконечность).

Это на самом деле уже достаточно, чтобы понять, что М (х) можно записать:

Код:
        р + г х
М (х) = -------
        Q + ы х

Где R / S является родительский узел записывается в виде рациональной.

У меня нет точного доказательства для этого, но соображения относительно ограничений на бесконечности
и значение в 0 ясно указывает на то, что должно быть правдой.

Без возможности писать М (х), как это было бы довольно сложно
вычислить любое значение М (х) в SQL.

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

Единственное, что не хватает является способ получения первого ребенка. М (1) не будет
делать, как это на самом деле первый «родной брат».

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

Tropashko отмечает, что простые дроби, как известно, известны,
не быть monotonuous. В зависимости от соотношения позиции одного из
число а, б, в ..., иногда целое значение увеличивается с числом,
иногда уменьшается.

Затем он предлагает использовать положительные цепные дроби
(Ум знаки минус):

Код:
                 1
М (х) = ---------------------
                     1 
       а + 1 - -------------
                       1
           Ь + 1 - ---------
   
                   с + 1 - х

Althouth это выражение кажется более сложным на первый взгляд,
это на самом деле гораздо проще визуализировать и работать.

Основная причина этого заключается в том, что это легко, чтобы убедить себя, что это
функция х растет (я имею в виду: х > у => М (х) > М (у)).

Это все меняет. Теперь мы можем быть уверены, что самым низким
края для интервала будут М (0), а самый высокий край будут М (1).
Мы обычно идентифицируют узел с М (0).

Родитель еще М (бесконечность), так что мы все еще можем написать функцию, как:

Код:
        р - г х
М (х) = -------
        д - с й

Единственное различие являются минус знаки, но они не являются проблемой.

Первый ребенок M (0) легко заметить: это M (1/2). Второй ребенок (первый
родственный M (1/2)) М (1/3), третий М (1/4), и так далее.

Первый родственный М (0) М (-1), второй брат М (-2), и так далее.

Вот небольшая часть генеалогии дерева, чтобы сделать вещи яснее:

Код:
М (бесконечность) ->М (0) -------->М (1/2) -> М (1 / (2-1 / 2)) -> ... асимптотически заканчивается в точке М (1)
        | | | |
        | \ ->М (-1) | \ ->М (1/3) ----> М (1 / (3-1 / 2)) -> ... асимптотически заканчивается в точке М (1/2)
        | |
        \ ---->М (-2) \ ->М (1/4) ---> М (1 / (4-1 / 2)) -> ... асимптотически заканчивается в точке М (1/3)
                                |
                                \ -> М (1 / (4-1 / 3)) -> ... асимптотически заканчивается в точке М (1 / (4-1 / 2))
                                       .
                                       .
                                       .

Тогда есть еще одна загвоздка: как вы вычислить родителя от нижнего края
интервал? Обычно, как Tropashko объясняет это, вы должны использовать
расширенный Алгоритм Евклида, но мы на самом деле не нужно делать, что для
Bitcoin блок дерева, так как каждый родитель присутствует уже в базе данных
так или иначе. Таким образом, мы можем получить родительское рациональное значение, и использовать его для
вычислить функцию Mцbius, и, таким образом, остальную часть дерева, как нам это нужно.

Таким образом, чтобы подвести итог, это довольно легко. Каждый узел дерево будет иметь два рациональные
число, определяющее интервал. Если нижний край узла А находится внутри
интервал узла B, то B является предком узла A. Для того, чтобы добавить ребенка к узлу,
нам просто нужно, чтобы получить родитель и вычислить функцию Mцbius при й = 1 / (п + 2),
где п число уже существующих детей. Это не должно быть трудно
чтобы получить п, мы в основном просто нужно сделать петлю и тест на наличие M (1 / (к + 2))
в базе данных.

Двигаясь целую ветвь не должна быть слишком трудно либо. Представьте себе, у нас есть
сирота блок с детьми, а потом вдруг родительский блок сироту
добавлена ​​в базу данных. Для того, чтобы залатать новую ветвь в базе данных, нам нужно
изменить интервалы для каждого узла ранее сиротской ветви. Он уверен,
стоить больше, чем добавление одного ребенка к листу, но, надеюсь, эта ситуация
не происходит слишком часто в любом случае.

Одна прохладная вещь с тем, что положительные дроби увеличиваются
функции, в том, что мы не должны хранить порядковое значение (высоту, глубину,
Однако вы называете его) каждый узел. Если мы сортируем наши запросы рациональных ниже
края, то мы автоматически получим sequencial порядок нашей цепи.
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu



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

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

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

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW