Bitcoin Forum
May 01, 2024, 10:55:57 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: « 1 2 3 [4] 5 6 7 8 9 10 »  All
  Print  
Author Topic: 📢 ⒶAtom - пишу свою крипту ⛏️⛏️⛏️  (Read 23851 times)
KevlarIt
Newbie
*
Offline Offline

Activity: 191
Merit: 0


View Profile
May 17, 2018, 07:51:10 PM
 #61

Молодец, ничего не добивается тот, кто ничего не делает.
Полностью согласен. Послежу за этим топиком, надеюсь, что автор не бросит эту затею в ближайшие неделю - две. Желаю удачи)
1714604157
Hero Member
*
Offline Offline

Posts: 1714604157

View Profile Personal Message (Offline)

Ignore
1714604157
Reply with quote  #2

1714604157
Report to moderator
1714604157
Hero Member
*
Offline Offline

Posts: 1714604157

View Profile Personal Message (Offline)

Ignore
1714604157
Reply with quote  #2

1714604157
Report to moderator
Each block is stacked on top of the previous one. Adding another block to the top makes all lower blocks more difficult to remove: there is more "weight" above each block. A transaction in a block 6 blocks deep (6 confirmations) will be very difficult to remove.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714604157
Hero Member
*
Offline Offline

Posts: 1714604157

View Profile Personal Message (Offline)

Ignore
1714604157
Reply with quote  #2

1714604157
Report to moderator
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 19, 2018, 08:30:14 AM
 #62

8. 3,14

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

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
Vtools
Full Member
***
Offline Offline

Activity: 411
Merit: 135


View Profile WWW
May 19, 2018, 11:01:15 AM
 #63

8. 3,14

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

Может стоит присоединиться к более успешному проекту.  У меня например все ок получается, транзакции свыше 1000 tps. Совсем скоро, после написания документации по архитектуре, буду выкладывать в общий доступ и набирать команду. Присоединишься?

Restart of the TERA project in 2022
Web ܀ ANN ܀ Discord ܀ Telegram ܀ Twitter
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 19, 2018, 11:19:22 AM
 #64

Может стоит присоединиться к более успешному проекту.  У меня например все ок получается, транзакции свыше 1000 tps. Совсем скоро, после написания документации по архитектуре, буду выкладывать в общий доступ и набирать команду. Присоединишься?

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

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

Я за идею. Надо смотреть что за проект, если он будем мне по душе, тогда конечно готов участвовать Smiley

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
SooEz4Me
Member
**
Offline Offline

Activity: 476
Merit: 19

Professional Designer & Manager | PM ME


View Profile WWW
May 19, 2018, 01:04:38 PM
 #65


Нарисовал за 20 минут, думаю замотивирует
Vtools
Full Member
***
Offline Offline

Activity: 411
Merit: 135


View Profile WWW
May 19, 2018, 01:23:54 PM
 #66

Нарисовал за 20 минут, думаю замотивирует[/center]
Замечательно. Может договоримся и вы для моего проекта нарисуете?

Restart of the TERA project in 2022
Web ܀ ANN ܀ Discord ܀ Telegram ܀ Twitter
SooEz4Me
Member
**
Offline Offline

Activity: 476
Merit: 19

Professional Designer & Manager | PM ME


View Profile WWW
May 19, 2018, 03:03:49 PM
 #67

Нарисовал за 20 минут, думаю замотивирует[/center]
Замечательно. Может договоримся и вы для моего проекта нарисуете?



Contact us
████████████████████████
█▌                                        ▐█
██▌                                    ▐██
█  █▌                                ▐█  █
█    █▌                            ▐█    █
█      ██▌                    ▐██      █
█          ███▌        ▐███          █
█        ██    ██████     ██       █
█    ██            ██            ██    █
███                                    ███
█                                            █
████████████████████████

Telegram or PM

lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 20, 2018, 06:59:25 PM
 #68


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

Спасибо! В команду атома присоединился дизайнер, пока он не нарисовал ничего, поэтому буду использовать ваш логотип! спасибо еще раз!

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
Tretyakovsky
Jr. Member
*
Offline Offline

Activity: 224
Merit: 1


View Profile WWW
May 20, 2018, 11:44:09 PM
 #69


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

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

Activity: 143
Merit: 1


View Profile
May 22, 2018, 10:47:14 PM
 #70

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

GOeureka   『 https://goeureka.io/ 』
Next-Gen Solution Shaping the Future of Online Hotel Booking
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 24, 2018, 10:02:11 PM
 #71

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

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

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

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


⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 24, 2018, 10:13:40 PM
 #72

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, это адрес, куда мы стучимся.

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

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 26, 2018, 11:25:40 PM
Last edit: June 06, 2018, 07:25:59 PM by lapitsky
 #73

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 для этого файла.

Уязвимости (будут дополнятся и выпиливаться):
- надо решить вопрос с тем, чтобы нода не могла спамить левым вектором нод другим нодам, нарушая их работу.
- тут будет ваша

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
bugor3113
Newbie
*
Offline Offline

Activity: 56
Merit: 0


View Profile
May 27, 2018, 09:01:15 PM
 #74

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 для этого файла.

Уязвимости (будут дополнятся и выпиливаться):
- надо решить вопрос с тем, чтобы нода не могла спамить левым вектором нод другим нодам, нарушая их работу.
- тут будет ваша


чет как то сложновато... я про прогрессию... может за счет усложнения алгоритмов упростить вычисления?
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 27, 2018, 09:08:12 PM
 #75

чет как то сложновато... я про прогрессию... может за счет усложнения алгоритмов упростить вычисления?

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

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
bugor3113
Newbie
*
Offline Offline

Activity: 56
Merit: 0


View Profile
May 27, 2018, 09:28:33 PM
 #76

чет как то сложновато... я про прогрессию... может за счет усложнения алгоритмов упростить вычисления?

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

ну смотри - в твоих кодах я ноухау не увидел, хотя ты, очевидно, в этом лучше разбираешься, но мне показалось что увеличение сложности кратно увеличивает количество вычислений(ну тупо в пропорциях)... ты видишь предел этого когда при существующем железе? Нет, я конечно, скорей всего ошибаюсь, но ты не думаешь что авторизацию нод в сети стоит решить иначе... например интеграция искусственного интеллекта, даже примитивного сделает код и своответсвенно его перспективы уникальными... на сегодня...
Golstrim
Sr. Member
****
Offline Offline

Activity: 1456
Merit: 253


Margin Trader


View Profile
May 27, 2018, 10:07:50 PM
 #77

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

█▀▀█
██▄█
My Trading View// Trading Community // Сообщество Трейдеров
█▀▀█
██▄█
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 28, 2018, 02:12:09 AM
Last edit: May 28, 2018, 02:53:33 AM by lapitsky
 #78

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

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

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

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

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

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
June 06, 2018, 07:36:27 PM
 #79

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, откуда нода уже может брать транзакции на свое усмотрение, для создания блоков.

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
RuslanFork
Sr. Member
****
Offline Offline

Activity: 610
Merit: 325


View Profile WWW
June 06, 2018, 09:27:41 PM
 #80

а почему была выбрано такое название?? возможно я просто что-то путаю но уже где-то встречал такое название...
даже на коинмаркет есть )))
https://coinmarketcap.com/currencies/atomic-coin/#charts

Pages: « 1 2 3 [4] 5 6 7 8 9 10 »  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!