라이트닝 네트워크에서 채널 재조정을 위한 잠재적 경로 시각화

다시 한 번, 2022년 프로그램과 협력하여 라이트닝 네트워크(LN)에서 잠재적 지불 경로를 선택하기 위한 흥미로운 시각화를 생성할 수 있었습니다.

LN은 비트코인 ​​위에 구축된 결제 채널 네트워크(PCN)입니다. LN 노드가 있으면 네트워크를 통해 지불을 보내고 받고 전달할 수 있습니다. 여기서는 송금에 중점을 둘 것입니다.

다른 노드로 지불을 보내면 지불이 성공하거나 실패할 때 데이터가 다시 돌아옵니다. 결제 경로, 각 채널의 수수료, 결제에 실패한 채널이 있다면 어떤 채널인지 확인할 수 있습니다.

재조정 목적으로 자신에게 지불금을 보낼 수도 있습니다. 재조정은 채널의 인바운드 및 아웃바운드 용량의 균형이 맞지 않을 때 필요합니다. 채널의 균형을 재조정하는 한 가지 방법은 순환 경로를 만드는 것입니다. 즉, 노드에서 다시 노드로 지불을 보내는 것입니다.

그림 1: 순환 경로 재조정. Matering the Lightning Network 책에서 가져온 이미지, p. 139.

노드 소유자가 채널의 균형을 재조정할 수 있는 잠재적인 경로를 시각화하는 데 도움이 되는 도구가 있으면 좋을 것입니다. 이를 통해 다양한 가능한 경로의 데이터를 필터링하고 정렬하여 탐색할 경로를 선택할 수 있습니다.

시각화 도구



이번에는 이를 쉽게 시각화할 수 있는 가장 좋은 방법은 데이터를 필터링, 정렬 및 선택하여 관심 있는 전체 경로를 표시할 수 있는 대화형 테이블을 사용하는 것이라고 결정했습니다.

도구는 4개의 테이블로 구성됩니다. 첫 번째는 재조정에 포함할 노드(중앙 노드)와 지불을 보낼 채널을 선택하는 것입니다. 두 번째 테이블은 이전에 선택한 채널에서 시작하여 중앙 노드에서 끝나는 경로를 선택하기 위한 것입니다. 세 번째는 결제를 받을 채널을 선택하는 것입니다. 마지막으로 네 번째 테이블은 중앙 노드에서 노드까지의 경로를 선택하기 위한 것이며 직전에 선택한 채널에서 끝납니다.

이 작업을 위해 사용된 3개의 주요 라이브러리는 networkx , pandasdash 입니다. network는 네트워크의 한 노드에서 나머지 노드까지의 단순 경로를 계산하는 데 사용되었습니다. pandas는 나중에 dash를 사용하여 대화형 테이블로 변환된 적절한 데이터 프레임을 만드는 데 사용되었습니다.

첫 번째 테이블



그림 2: 중앙 노드 및 발신 채널 선택을 위한 표 1.

이 테이블에는 3개의 열이 있습니다.

  • 소스: 노드 선택

  • central_node: 재조정 경로에 포함할 특정 노드 선택

  • Channel_out: 결제를 보낼 채널을 선택합니다.

  • 두 번째 테이블



    그림 3: 중앙 노드에 대한 경로 선택을 위한 표 2.

    이 표가 더 재미있습니다. 모든 열은 필터링 및 정렬을 지원합니다. 어떤 경로가 더 저렴하고, 홉이 더 적고, 전체 용량이 더 큰지 쉽게 확인할 수 있습니다.

    다음은 이 테이블을 작성하는 코드의 일부입니다.

    @app.callback(
        Output('secondtable-container', 'children'),
        Input('first-table', 'selected_row_ids'),
    )
    def make_second_table(selected_rows):
        if selected_rows is None:
            source_central, channel_out = [], []
        else:
            rows = [row.split(' -> ') for row in selected_rows]
            source_central = [row[0] for row in rows]
            channel_out = [row[1] for row in rows]
    
        masks = (grouped_routes.peers.isin(source_central) & grouped_routes.channel_out.isin(channel_out))
        second_dff = grouped_routes[masks]
    
        return html.Div([
            dash_table.DataTable(
                id='second-table',
                columns=[
                    {'name': i, 'id': i, 'deletable': True} for i in second_dff.columns
                    if i != 'id' and i != 'channel_out'
                ],
                data=second_dff.to_dict('records'),
                editable=False, # cells are not editable
                filter_action='native', # filter by entering text in the input box
                sort_action='native',
                sort_mode='multi',
                row_selectable='single',  
                page_action='native',
                page_current=0,
                page_size=10,
            ),
            html.Div(id='thirdtable-container'),  
        ])
    


    세 번째 테이블



    그림 4: 지불을 받을 채널을 선택하기 위한 표 3.

    세 번째 테이블은 첫 번째 테이블과 유사합니다. 유일한 목적은 지불을 받고자 하는 채널을 선택하여 순환 경로를 완료하기 위해 보유한 채널을 표시하는 것입니다.

    네 번째 테이블



    그림 5: 노드로 돌아가는 경로를 선택하기 위한 표 4.

    최종 테이블은 두 번째 테이블과 유사하지만 재조정 경로를 완료하기 위해 기준에 따라 적절한 경로를 선택하기 위한 테이블입니다.

    행을 선택하면 새 컨테이너에 다음과 같이 순환 경로의 전체 정보가 표시됩니다.
    그림 6: 전체 경로의 집계 데이터.

    다음은 테이블 기능의 전체 데모입니다.



    이와 같은 도구의 가치가 테스트되고 있습니다. 이것이 번개 노드에 어떤 식으로든 도움이 되는지 의견에 자유롭게 남겨주세요.

    좋은 웹페이지 즐겨찾기