Pages:
Author

Topic: Ⓐ Atom - пишу свою крипту ✌✌✌ - page 7. (Read 23952 times)

member
Activity: 202
Merit: 27
Atom foundation
11. Мемпул или из грязи в князи, из болота в озеро.

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

Code:
@app.route('/connect', methods=['GET', 'POST'])
def node_connect():
    msg = request.form.to_dict()
    directory = 'chain/config/'
    filename = 'txpool_swamp.atm'
    node.add_dict_file(msg,directory,filename)  # пишем в mempool
    msg_no_sign = {'send':msg['send'],'from':msg['from'],'count':msg['count'],'adr':msg['adr']}
    rnd_node = node.poh(msg_no_sign,10)
    verify = wallet.verify_sig(msg['from'],msg['sign'],msg_no_sign)
    if verify == True:
        msg_no_sign['sign'] = msg['sign']
        send_to_all = node.send_to_all_node(rnd_node,msg_no_sign)
        get_data = node.load_and_send(msg['adr'],msg['count'],msg['send'],msg['send_komis'])


        return jsonify(get_data), 200
    if verify == False:
        return jsonify('Bad sign'


msg = request.form.to_dict()
получаем с сайта через ajax подписанную транзакцию


node.add_dict_file(msg,directory,filename)  # пишем в mempool
Пишем в файл на ноде (что-то типа socket, файл в который пишем и его постоянно будет опрашивать на сервере скрипт, который будет проверять наличие транзакций)
В файле txpool_swamp.atm будут хранится все подряд транзакции отправленные в ноду. В файле будет ограничение, допустим 1-4 мб максимум. Защита от переполненения (правильно?)

После чего отдельный процесс txpool_server будет постоянно следить за файлом и если там что-то есть, сразу обрабатывать:


Code:
import pickle
import time
from cl_node import *
from wallet import *
node = Node()  # Создаем объект Node
wallet = Wallet()  # Создаем объект Wallet


import asyncio
def check_tx(msg):
    # there need check tx
    # and add tx to clear leak pool
    path = 'chain/config/'
    filename = 'txpool_leak.atm'
    if not os.path.exists(path):
        os.makedirs(path)
    node.add_dict_file(msg, path, filename)


async def swamp():
    k = 0
    dict = {}
    path = 'chain/config/'
    filename = 'txpool_swamp.atm'
    while True:
        if not os.path.exists(path):
            os.makedirs(path)
        with open(path+filename, 'rb') as f:
            while True:
                try:
                    dict[k] = pickle.load(f)
                    check_tx(dict[k])
                    print(dict[k])
                    k += 1
                except EOFError:
                    open(path+filename, 'w').close()
                    # тут await еще один
                    break                      


async def send_another_node():
    while True:
        print('Try send anoter node')
        await asyncio.sleep(1)


ioloop = asyncio.get_event_loop()
tasks = [ioloop.create_task(swamp()), ioloop.create_task(send_another_node())]
wait_tasks = asyncio.wait(tasks)
ioloop.run_until_complete(wait_tasks)
ioloop.close()


Здесь мы создаем асинхронный код, одна функция считывает, после  того, как весь файл обработан, мы стараемся отправить все другим нодам, для синхронизации
Следующий этап, обработать болото из траназкцией, то есть проверить валидность подписи транзакции и ее структуру, после чего поместить в файл txpool_lake.atm, откуда нода уже может брать транзакции на свое усмотрение, для создания блоков.
member
Activity: 202
Merit: 27
Atom foundation
Нет, я конечно, скорей всего ошибаюсь, но ты не думаешь что авторизацию нод в сети стоит решить иначе... например интеграция искусственного интеллекта, даже примитивного сделает код и своответсвенно его перспективы уникальными... на сегодня...

в данном случае при добавлении новой ноды надо будет использовать pow, только один раз, чтобы не было атак в стиле, "добавлю ка я миллион виртуальных нод и посмотрим, как система справится". если нода хочет добавится, как майнер, она делает запрос, получает в ответ число и после делает у себя pow и отправляет доказательство о проделанной работе и сеть принимает ноду для дальнейшего общения, которое будет ограничиваться только пропускной способностью канала. (я позже напишу отдельный пост и буду ждать критику)

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

Круто, но было бы еше лучше, если сама крипта осуществляла бы какую то функцию. В самих кодах я не разбираюсь, так что ничего сказать не могу по этому поводу. А в целом успехов. Это будет очередной щиткоин или что то новое?

Пока фишки видятся такими (вилами по по воде):
 - на python людям будет проще писать новые модули и искать баги. скорость разработки будет гораздо быстрее.
 - это будет софт монета, то есть обновление кода будет происходить довольно часто (будет система безболезненного обновления без форков)
 - каждая нода будет обрабатывать монеты и иметь возможность хранить данные в формате ключ:значение, что позволит людям самостоятельно создавать свою логику и как они хотят это использовать, либо под токены, либо под хранения данных для своих проектов.
 - смартконтаракты будут на python, поэтому будет очень легко создавать их, что опять же увеличить популяризацию монеты
sr. member
Activity: 1456
Merit: 253
Margin Trader
Круто, но было бы еше лучше, если сама крипта осуществляла бы какую то функцию. В самих кодах я не разбираюсь, так что ничего сказать не могу по этому поводу. А в целом успехов. Это будет очередной щиткоин или что то новое?
newbie
Activity: 56
Merit: 0
чет как то сложновато... я про прогрессию... может за счет усложнения алгоритмов упростить вычисления?

Привет! Не понимаю о чем речь? В каком месте упростить вычисления? Huh

ну смотри - в твоих кодах я ноухау не увидел, хотя ты, очевидно, в этом лучше разбираешься, но мне показалось что увеличение сложности кратно увеличивает количество вычислений(ну тупо в пропорциях)... ты видишь предел этого когда при существующем железе? Нет, я конечно, скорей всего ошибаюсь, но ты не думаешь что авторизацию нод в сети стоит решить иначе... например интеграция искусственного интеллекта, даже примитивного сделает код и своответсвенно его перспективы уникальными... на сегодня...
member
Activity: 202
Merit: 27
Atom foundation
чет как то сложновато... я про прогрессию... может за счет усложнения алгоритмов упростить вычисления?

Привет! Не понимаю о чем речь? В каком месте упростить вычисления? Huh
newbie
Activity: 56
Merit: 0
member
Activity: 202
Merit: 27
Atom foundation
10. Принцип добавления новой ноды и вектор нод.
Ссылки:
- Часть кода уже показана в предыдущем посте, тут он обновлен и добавлен новый.
- Видео для понимания, что такое векторные часы
- Создал телеграмм канал, ⚡присоединяйтесь⚡


Создается в первой ноде генезис векторный файл node_vector
который содержит информацию о нодах. Что значит векторный? Ниже опишу

Code:
   directory = 'chain/config/'
    filename = 'node_vector.atm'
    if not os.path.exists(directory):
        os.makedirs(directory)
    # make genesis node vector number
    atom_vector_data[1] = {
        'node': 1,
        'adress': node_adr,
        'ipport': '192.168.0.100',
        'active': True,
        }
    atom_vector_data[2] = {
        'next_key' : randint(1, 1000000)
    }
    node.write_dict_file(atom_vector_data,directory,filename)  # метод который записывает dict в файл в pickle формате

Тут мы создаем папку config в которой создаем файл node_vector.atm, в котором будут хранится данные в формате:

NODE 1 {номер ноды 1, ip ноды 1, публичный адрес ноды1;номер ноды 2, ip ноды 2, публичный адрес ноды2;номер ноды 3, ip ноды 3, публичный адрес ноды3;время обновления}
NODE 2 {номер ноды 1, ip ноды 1, публичный адрес ноды1;номер ноды 2, ip ноды 2, публичный адрес ноды2;номер ноды 3, ip ноды 3, публичный адрес ноды3;время обновления}
итд

Каждая нода когда будет соединяться с другой, будет получать вектор ее данных и отправлять свой. Если какие-то данные будут отличаться от текущих, они будут обновляться. Вектор нод считается валидным, когда у более 51% нод одинаковый вектор.

Следующая запись в векторе нод имеет только одну запись {next_key : randint(1, 1000000)}, тоесть переменную со случайным числом от 1 до 1000000.  
Делается это для того, чтобы когда новая нода захочет присоединиться, она запрашивает векторный файл, получает последнее значение next_key, и нода отправляет свои данные на присоединение, и содержит в этих данных next_key и nonce, который  создает 00 в начале хеша от этих данных.
Зачем это? Защита от подключения огромного количества левых или виртуальных нод. чтобы присоединиться новой ноде нужно сделать простой pow. если pow не подходит, другие ноды отвергают ее.  Чем больше будет нод в системе, тем больше сложность pow.

Запрос через панель ноды в браузере

Code:
@app.route('/zapros', methods=['GET', 'POST'])
def zapros():
    # make geniesis block
    zapros_adr = request.args.get('zapros_adr', 0, type=str)
    base_node = request.args.get('base_node', 0, type=str)
    ipport = request.args.get('ipport', 0, type=str)
    result = node.try_connect_to_network(zapros_adr,ipport,base_node)
    return jsonify(result=result)
Используется flask, забираем данные с frontend через ajax (с сайта получаем данные)

Метод try_connect_to_network соединяется с нодой указаной в base_node

Code:
def try_connect_to_network(self,adr,ipport,base_node):
        context = zmq.Context(1)
        client = context.socket(zmq.REQ)
        SERVER_ENDPOINT = 'tcp://'+base_node
        client.connect(SERVER_ENDPOINT)
        poll = zmq.Poller()
        poll.register(client, zmq.POLLIN)
        REQUEST_TIMEOUT = 2500
        REQUEST_RETRIES = 3
        retries_left = REQUEST_RETRIES

        while retries_left:
            data_send = {'addmeplz': '1','adr': adr, 'ip': ipport}
            data_send = str(data_send).encode()
            request = data_send
            print("I: Пересылаю (%s)" % request)
            client.send(request)
            data = ''
            expect_reply = True
            while expect_reply:
                socks = dict(poll.poll(REQUEST_TIMEOUT))
                if socks.get(client) == zmq.POLLIN:
                    reply = client.recv()
                    reply = eval(reply.decode())
                    print(reply['send_hash'])
                    print(self.thishash(request))
                    if not reply:
                        data = 'break, not reply recive'
                        break
                    if reply['send_hash'].decode() == self.thishash(request):
                        print("I: Server replied (%s)" % reply)
                        retries_left = 0
                        data = 'answer: ' + reply['msg']
                        expect_reply = False
                    else:
                        print("E: Malformed reply from server: %s" % reply)

                else:
                    data = 'no response'
                    print("W: No response from server, retrying…")
                    # Socket is confused. Close and remove it.
                    client.setsockopt(zmq.LINGER, 0)
                    client.close()
                    poll.unregister(client)
                    retries_left -= 1
                    if retries_left == 0:
                        print("E: Server seems to be offline, abandoning")
                        break
                    print("I: Reconnecting and resending (%s)" % request)
                    # Create new connection
                    client = context.socket(zmq.REQ)
                    client.connect(SERVER_ENDPOINT)
                    poll.register(client, zmq.POLLIN)
                    client.send(request)
        return str(data)

метод отправляет словарь (dict) data_send = {'addmeplz': '1','adr': adr, 'ip': ipport}  рабочей ноде, и получает обратно ответ в виде хеша, который проверяется хешированием отправленной информацией
if reply['send_hash'].decode() == self.thishash(request), если хеши совпадают, значит данные получены верно, можно обрабатывать их.

Рабочая нода(сервер), который получает данные, обрабатывает их:
Code:
context = zmq.Context(1)
server = context.socket(zmq.REP)
server.bind("tcp://*:5555")

cycles = 0
while True:
    request_clear = server.recv()
    request = eval(request_clear.decode())
    result_print = 'none'
    if 'addmeplz' in request:
        result = node.add_new_node(request['adr'],request['ip'])
        result_print = result
    send_hash = node.thishash(request_clear).encode()
    send_rep = {
            'send_hash' : send_hash,
            'msg': result
        }
    print(result_print)
    print(str(send_rep).encode())
    server.send(str(send_rep).encode())

Рабочая нода получает данные, проверяет что за сообщение, и запускает метод add_new_node

Code:
   def add_new_node(self,adr,ipport):
        node_vector = self.read_vector_file()  # читай файл
        for key, value in node_vector.items():
            if adr in node_vector[key].values():
                return 'This adr has in vector file, not add'
        dlina = len(node_vector)
        node_vector[dlina+1] = {
            'node': dlina+1,
            'adress': adr,
            'ipport': ipport,
            'active': False
        }
        self.write_dict_file(node_vector,'chain/config/','node_vector.atm')  # обновляем файл
        return 'Add in global vector file'

Тут реализовано добавление новых данных в вектор файл. Пока еще не реализован алгоритм pow для этого файла.

Уязвимости (будут дополнятся и выпиливаться):
- надо решить вопрос с тем, чтобы нода не могла спамить левым вектором нод другим нодам, нарушая их работу.
- тут будет ваша
member
Activity: 202
Merit: 27
Atom foundation
9. Создание ноды и присоединение новой ноды


Замучался тестировать передачу данных между компьютерами. Создал дома на основе wifi простую локальную сеть с двумя ip адресами и открыл порты 5555, через которые будут работать ноды.

Сервер(рабочая нода или мастернода) слушает все что прилетает в порт 5555

Code:
from __future__ import print_function

from random import randint
import time
import zmq
import sys
from cl_node import *

node = Node()
context = zmq.Context(1)
server = context.socket(zmq.REP)
server.bind("tcp://*:5555")

cycles = 0
while True:
    request_clear = server.recv()
    request = eval(request_clear.decode())
    if 'wtf' in request:
        print('Work on new transaction')
        print(cycles, ": Normal request (%s)" % str(request))

    if 'addmeplz' in request:
        print('Try add new node')
        node.add_new_node(request['adr'],request['ip'])
        print(cycles, ": Normal request (%s)" % str(request))


    cycles += 1
    # Simulate various problems, after a few cycles
    if cycles > 1000 and randint(0, 1000) == 0:
        print("I: Simulating a crash")
        break
    elif cycles > 1000 and randint(0, 100) == 0:
        print("I: Simulating CPU overload")
        time.sleep(2)

    #time.sleep(1) # Do some heavy work
    send_hash = node.thishash(request_clear).encode()
    print(send_hash)
    server.send(send_hash)

server.close()
context.term()

В данном коде мы с помощью zeroMQ получаем сообщение на порт, и если в сообщении есть код - addmeplz, тогда будем добавлять новую ноду в список тех нод, которые отвечают за консенсус.

А это клиент, который стучится в сеть, чтобы вступить в ряды нод:

Code:
   def try_connect_to_network(self,adr,ipport,base_node):
        context = zmq.Context(1)
        client = context.socket(zmq.REQ)
        SERVER_ENDPOINT = 'tcp://'+base_node
        client.connect(SERVER_ENDPOINT)
        poll = zmq.Poller()
        poll.register(client, zmq.POLLIN)
        REQUEST_TIMEOUT = 2500
        REQUEST_RETRIES = 3
        retries_left = REQUEST_RETRIES

        while retries_left:
            data_send = {'addmeplz': '1','adr': adr, 'ip': ipport}
            data_send = str(data_send).encode()
            request = data_send
            print("I: Пересылаю (%s)" % request)
            client.send(request)

            expect_reply = True
            while expect_reply:
                socks = dict(poll.poll(REQUEST_TIMEOUT))
                if socks.get(client) == zmq.POLLIN:
                    reply = client.recv()
                    print(reply)
                    print(self.thishash(request))
                    if not reply:
                        break
                    if reply.decode() == self.thishash(request):
                        print("I: Server replied OK (%s)" % reply)
                        retries_left = 0
                        data = 'server get you request'
                        expect_reply = False
                    else:
                        print("E: Malformed reply from server: %s" % reply)

                else:
                    print("W: No response from server, retrying…")
                    # Socket is confused. Close and remove it.
                    client.setsockopt(zmq.LINGER, 0)
                    client.close()
                    poll.unregister(client)
                    retries_left -= 1
                    if retries_left == 0:
                        print("E: Server seems to be offline, abandoning")
                        break
                    print("I: Reconnecting and resending (%s)" % request)
                    # Create new connection
                    client = context.socket(zmq.REQ)
                    client.connect(SERVER_ENDPOINT)
                    poll.register(client, zmq.POLLIN)
                    client.send(request)
        return str(data)

В данном случае, это метод, который получает адрес (публичный адрес ноды), ip и port будущей ноды(ip должен быть статичным), и base_node, это адрес, куда мы стучимся.

Дальше, надо чтобы сервер (мастернода), получив сообщение, добавил новую ноду в файл со списком рабочих нод (вектор активных нод) и разослать его всем остальным нодам, для консенсуа по списку активных нод (или вектору активных нод).
member
Activity: 202
Merit: 27
Atom foundation
развивайся и не опускай руки, будет интересно почитать о процессе реализации. относительно целей: ставь конкретные ориентиры, чтобы не плавать в безграничном океане. Успехов тебе!

Знаю по себе, пока есть внутренняя мотивация, я не опущу руки, в данный момент мотивация зашкаливает!  Cool

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

людей здесь очень много и само по себе комюните очень крутое  Wink

jr. member
Activity: 143
Merit: 1
развивайся и не опускай руки, будет интересно почитать о процессе реализации. относительно целей: ставь конкретные ориентиры, чтобы не плавать в безграничном океане. Успехов тебе!
jr. member
Activity: 224
Merit: 1

Нарисовал за 20 минут, думаю замотивирует

Спасибо! В команду атома присоединился дизайнер, пока он не нарисовал ничего, поэтому буду использовать ваш логотип! спасибо еще раз!
верю в вашу идею и желание. Тише едем дальше будем так и победим. главное не спешить и разбираться, где-то отвлекаться от работы чтобы отдохнули мозги. надеюсь на форуме есть прошаренные люди конкретно в этом направлении и насоветуют еще чего. а так удачи вам огромной
member
Activity: 202
Merit: 27
Atom foundation

Нарисовал за 20 минут, думаю замотивирует

Спасибо! В команду атома присоединился дизайнер, пока он не нарисовал ничего, поэтому буду использовать ваш логотип! спасибо еще раз!
full member
Activity: 411
Merit: 139
Нарисовал за 20 минут, думаю замотивирует[/center]
Замечательно. Может договоримся и вы для моего проекта нарисуете?
member
Activity: 476
Merit: 19
Professional Designer & Manager | PM ME

Нарисовал за 20 минут, думаю замотивирует
member
Activity: 202
Merit: 27
Atom foundation
Может стоит присоединиться к более успешному проекту.  У меня например все ок получается, транзакции свыше 1000 tps. Совсем скоро, после написания документации по архитектуре, буду выкладывать в общий доступ и набирать команду. Присоединишься?

У меня zeroMQ выдает легко больше 1000 tps, проблема не конкретно с передачей данных, а с самим планом разработки, потому что если я сейчас начну не по правильному пути разрабатывать, все это закончится лютыми костылями. Я вроде уже определился, начну кодить дальше на днях.

Присоединишься?

Я за идею. Надо смотреть что за проект, если он будем мне по душе, тогда конечно готов участвовать Smiley
full member
Activity: 411
Merit: 139
8. 3,14

Блог мертв?
Конечно, как всегда думаешь, что самый умный, сейчас все тут налепишь и блокчейн заработает.
Хрен там был. Первый мой затык был, когда я разбирался с эллиптическими кривыми и тогда уже немного поплыли мозги, сейчас они поплыли, когда стал разбираться в консенсусе и общении нод между собой, потом еще добавился mempool и вобще крыша поехала. Но это все фигня, в целом,  я полон энтузиазма и атом ванлав  Wink Пока не могу ничего накодить, даже строчки, потому что пока не понимаю, в каком порядке кодить и с какого края начать. Слишком сложная архитектура вырисовывается, рисую изо дня в день структуру и понимаю, что опыта в сетевом программировании очень мало..

Может стоит присоединиться к более успешному проекту.  У меня например все ок получается, транзакции свыше 1000 tps. Совсем скоро, после написания документации по архитектуре, буду выкладывать в общий доступ и набирать команду. Присоединишься?
member
Activity: 202
Merit: 27
Atom foundation
8. 3,14

Блог мертв?
Конечно, как всегда думаешь, что самый умный, сейчас все тут налепишь и блокчейн заработает.
Хрен там был. Первый мой затык был, когда я разбирался с эллиптическими кривыми и тогда уже немного поплыли мозги, сейчас они поплыли, когда стал разбираться в консенсусе и общении нод между собой, потом еще добавился mempool и вобще крыша поехала. Но это все фигня, в целом,  я полон энтузиазма и атом ванлав  Wink Пока не могу ничего накодить, даже строчки, потому что пока не понимаю, в каком порядке кодить и с какого края начать. Слишком сложная архитектура вырисовывается, рисую изо дня в день структуру и понимаю, что опыта в сетевом программировании очень мало..
newbie
Activity: 191
Merit: 0
Молодец, ничего не добивается тот, кто ничего не делает.
Полностью согласен. Послежу за этим топиком, надеюсь, что автор не бросит эту затею в ближайшие неделю - две. Желаю удачи)
jr. member
Activity: 140
Merit: 1
Интересный топик, будут следить за твоими успехами, молодец и удачи тебе.
Присоединяюсь. Я тут теперь  Smiley
Pages:
Jump to: