누가 Bitcoin을 제어합니까? 당신입니까? 아니면 지갑? BTC 주소 및 거래원리 분석
安比(SECBIT)实验室
2018-09-29 02:58
本文约7152字,阅读全文需要约29分钟
비트코인 지갑을 사용하고 있다면 이 기사가 적합합니다.

텍스트

  • 편집자 주: 이 기사는 Ambi Lab(저자: Ambi Lab)에서 작성했으며 승인을 받아 게시되었습니다.

  • 비트코인 주소는 1로 시작하는 주소와 3으로 시작하는 주소가 있습니다. 둘 사이에 차이점이 있나요?

  • 어떤 상황에서 주소의 비트코인이 잠겨 있습니까?

  • 정확히 누가 Bitcoin을 통제하고 있습니까? 아니면 지갑?

    비트코인 지갑을 사용 중이고 위의 세 가지 질문에 답할 수 없다면 이 기사가 도움이 될 것입니다.

    SECBIT 연구소가 디지털 지갑의 소스 코드를 감사했을 때 pywallet이라는 비트코인 ​​지갑 오픈 소스 라이브러리에 심각한 결함이 있음을 발견했습니다. pywallet에서 생성한 OmniLayer 수신 주소로 전송하면 자산이 영구적으로 손실됩니다.

    SECBIT 연구소의 블록체인 기술 전문가인 zer0to0ne에 따르면 OmniLayer 프로토콜을 사용하면 비트코인 ​​블록체인에서 USDT와 같은 맞춤형 자산을 발행할 수 있습니다. OmniLayer 자산 거래의 본질은 비트코인 ​​거래입니다. 비트코인 거래를 위한 많은 코드 기반이 있으며 pywallet이 그 중 하나입니다. OmniLayer 형식을 준수하는 Bitcoin 트랜잭션을 편리하게 구성할 수 있습니다. 현재 pywallet은 일부 디지털 지갑 소프트웨어에 적용되었습니다.

    그러나 오픈 소스 라이브러리 pywallet이 OmniLayer 지갑 주소를 생성할 때 주소의 접두사를 실수로 뒤집어 여러 자산이 유효하지 않은 주소에 잠겼습니다!

    다음은 pywallet 관련 오류 코드의 스크린샷입니다.https://github.com/ranaroussi/pywallet/commit/eb784ea4dd62fe2a50e1352e7d24438fc66a4ac0#diff-ca3a8be6f2ab4be3bfd69a49f5f4122a

    파일 주소:

    대기열에 뛰어들어 과학 대중화: 비트코인 ​​네트워크에는 일반 공개 키 주소(1-address), 스크립트 해시 주소(3-address) 및 격리된 증인 주소(bc1-address)의 세 가지 가장 일반적인 주소 유형이 있습니다. 구별하다. 그 중 1번지의 접두어는 0x00이고 3번지의 접두어는 0x05이다.

    • 1-Address: 가장 일반적인 비트코인 ​​주소로, 일반적으로 일반적인 송금 및 결제에 사용됩니다. 1-주소는 실제로 공개 키 해시의 인코딩입니다. 1번 주소의 서명을 확인한 후 결제를 잠금 해제할 수 있습니다.

    • 3-주소: 이 주소는 스크립트 해시 주소입니다. 이 유형의 주소는 실제로 비트코인 ​​스크립트 해시의 코드에 해당합니다.

    • bc1-address: 분리된 증인 트랜잭션에 사용되는 bech32 인코딩 주소.

    오픈 소스 라이브러리 pywallet은 주소 접두사를 뒤집어 1-주소를 3-주소로 잘못 설정합니다. 따라서 원래 1번지로 옮기려고 했던 자산이 3번지로 잘못 옮겨지게 됩니다. 계정 소유자가 자산을 출금하기 위해 1-주소 확인 방법, 즉 개인 키 서명을 사용하면 블록체인 네트워크는 3-주소 실행 스크립트를 사용하여 확인을 수행하므로 사용자가 자산을 정상적으로 출금할 수 없습니다!

    pywallet 오픈 소스 라이브러리를 주의해서 사용하세요! !

    사실: 비트코인은 돈을 이체하는 기능을 실제로 구현한 적이 없습니다.

    Bitcoin의 구현은 우리가 직관적으로 이해하는 계정 모델과 다른 UTXO 모델을 기반으로 하기 때문에 이는 많은 사람들의 기대를 뛰어넘는 것입니다. zer0to0ne은 사실 비트코인이 일반적인 의미에서 전송 기능을 실제로 구현한 적이 없다고 설명했습니다. Satoshi Nakamoto는 일련의 비트코인 ​​스크립트 연산자와 비트코인용 비트코인 ​​스크립트 실행기를 설계했으며 소위 전송 프로세스는 실제로 비트코인 ​​스크립트 잠금 및 잠금 해제 프로세스에 의해 시뮬레이션됩니다. 이는 일상생활에서의 원장 개념(또는 계정 모델)과는 다른 것입니다.

    이해의 편의를 위해 비트코인 ​​블록체인에서의 자산 거래를 금고에 자산을 잠그는 것과 비교할 수 있으며, 금고의 키를 보유한 사람(즉, 수취인)만이 거래를 위해 금고에 있는 자산을 꺼낼 수 있습니다. 예를 들어 Alice가 Bob에게 자산을 지불하려는 경우 Alice는 자산을 금고에 잠그고 Bob만이 금고의 키를 가지고 있습니다. 즉, Bob만이 자산을 꺼낼 수 있습니다. Bob이 자산을 꺼내려면 동시에 자산을 사용해야 합니다(즉, 자산을 다른 금고에 잠가야 함). Bob이 자산을 꺼내기 전에 자산은 실제로 Bob의 것이 아닙니다. Bob이 키를 분실하면 더 이상 자산을 인출할 수 없다고 상상해 보십시오. 즉, 자산이 여전히 금고에 보관되어 있으면 Alice의 소유도 아니고 Bob의 완전한 소유도 아닙니다. 물론 Alice는 누구나 열 수 있는 금고에 자산을 넣을 수도 있으며, 이를 Any-Can-Spend 거래라고도 합니다.

    비트코인 블록체인의 수신 주소가 다르기 때문에 다양한 유형의 금고가 있습니다. 다양한 유형의 금고를 열려면 다양한 유형의 키가 필요합니다. 지불인은 수취인을 위해 금고를 맞춤화하고 자산을 금고에 넣고 잠근 다음 금고를 공공 장소에 던집니다. 금고를 여는 방법에는 두 가지가 있습니다.

    • 수취인이 1번지인 경우 금고를 1종금고라고 합니다. 해당 키는 지정된 수신 주소에 해당하는 개인 키여야 합니다. 금고를 여는 과정은 1주소 공개키와 공개키에 해당하는 디지털 서명을 검증하는 것으로, 일반 계좌 주소로 돈을 이체할 때 우리가 일반적으로 이해하는 검증 과정이기도 하다.

    • 수취인이 3번지일 경우 3번지 금고라고 합니다. 잠금 해제 키는 실행 가능한 Bitcoin 스크립트여야 합니다. 금고의 잠금을 해제하는 과정은 다음과 같습니다. 비트코인 ​​스크립트의 해시 값은 3-주소에 해당하고 비트코인 ​​스크립트 실행기는 스크립트를 실행한 후 성공적으로 반환됩니다. 즉, 원본 스크립트를 가지고 있고 이를 성공적으로 실행할 수 있는 사람만이 이 금고의 자산을 추출할 수 있습니다.

    이 섹션의 질문으로 돌아가서: Bitcoin이 진정한 의미에서 전송 기능을 실현한 적이 없다고 말하는 이유는 무엇입니까? 대답은 간단합니다. 왜냐하면 비트코인 ​​시스템에는 계정의 개념이 존재하지 않고 계정 간의 전송이 불가능하기 때문입니다. 한 사람이 미래에 얼마나 많은 금고를 열 수 있는지도 알 수 없습니다.

    위의 설명을 통해 pywallet 오픈 소스 라이브러리가 1번 주소를 3번 주소로 잘못 인식하는 경우 원래 1번 유형 금고를 3번 금고로 변환한 것과 같으며 계정 소유자는 여전히 보유하고 있음을 알 수 있습니다. 1 - 금고 열쇠의 잠금을 해제하면 당연히 금고를 열 수 없습니다. 그렇다면 zer0to0ne이 실수로 잠근 OmniLayer 디지털 자산을 복구할 수 있을까요?

    1-주소 키를 사용하여 3-금고를 열 가능성이 있습니까?

    zer0to0ne은 P2PKH(Pay to Public Key Hash) 및 P2SH(Pay to Script Hash)라는 두 가지 중요한 개념에 대해 설명했습니다. 이 두 명사는 두 가지 유형의 비트코인 ​​거래를 나타냅니다.

    다음은 zer0to0ne에 대한 훌륭한 기술적 세부 분석입니다.

    P2PKH - 사토시 나카모토의 위대한 발명품

    Base58(0x00 + + Checksum)

    Pay to Public Key Hash는 이름에서 알 수 있듯이 비트코인을 금고에 넣는 것이고, 열쇠구멍은 공개키 해시(Public Key Hash)입니다. 우리가 보는 가장 일반적인 1-주소는 기본적으로 공개 키 해시의 인코딩입니다. 1- 주소 생성 프로세스도 매우 간단합니다.Hash160을 통해 공개 키를 계산하여 Public Key Hash를 얻고, Public Key Hash의 헤드에 접두어 0x00을 추가하고, Hash 끝에 체크섬을 추가하고, 1의 시작 부분에 있는 비트코인은 Base58 주소를 통해 얻습니다.

    P2PKH 트랜잭션 유형의 안전한 구성 프로세스를 살펴보겠습니다.Alice는 예를 들어 Bob에게 Bitcoin을 보냅니다.

    OP_DUP 

    OP_HASH160 

    지불인 Alice는 금고를 구성할 때 잠금 스크립트를 설정해야 합니다.

    OP_EQUALVERIFY 

    OP_CHECKSIG

    (Bob의 수신 주소에 포함된 Public Key Hash)

    참고: 이 단계는 Alice가 Bob을 위해 금고를 사용자 지정하고 비트코인을 금고에 넣고 Bob의 공개 키 PubKey Hash로 잠그는 것으로 이해할 수 있습니다. 이제 개인 키를 보유한 Bob 외에는 아무도 이 자물쇠를 열 수 없습니다.

    Bob이 Alice가 준 비트코인을 사용해야 할 때 필요한 매개변수를 제공해야 합니다: 거래 서명 + 금고를 열기 위한 공개 키(기술 전문 용어: scriptSig) 실행 후 잠금 스크립트가 True를 반환하도록 이 단계는 일반적으로 지갑에 의해 자동으로 수행됩니다.

    Bitcoin 노드가 scriptSig의 합법성을 확인하는 방법을 살펴보겠습니다.

    (비트코인 마스터링의 이미지) 스크립트 실행 프로세스는 그림에 나와 있으며 트랜잭션 서명 후 Bob이 얻은 데이터(실제로 데이터 길이 정보 포함), 실제 scriptSig는 다음과 같아야 합니다.

    , Bitcoin 스크립트 실행기는 PUSH 데이터에서 시작됩니다.PUSH 작업은 첫 번째 바이트를 읽어 스택에 푸시할 데이터의 길이 정보를 얻은 다음 실행이 완료될 때까지 Bitcoin 스크립트를 계속 실행하여 확인합니다. 실행 결과.첫 번째 스택은,그 다음에, HASH160은 스택의 맨 위를 팝하고 해시를 계산하고 결과를 다시 스택으로 푸시한 다음 EQUALVERIFY를 사용하여 해시를 팝업하여 같은지 비교하고 같으면 True를 반환하고 그렇지 않으면 True를 반환합니다. 같으면 트랜잭션이 유효하지 않은 것으로 표시됩니다. 이 단계에서 서명자의 신원의 정확성을 보장하기 위해 공개키가 노출되지만, 해커나 채굴자는 노출된 공개키를 이용하여 원래 트랜잭션을 대체할 새로운 트랜잭션을 구성할 수 있으므로 보안을 보장할 수 없으므로 다음 단계가 필요합니다. 보장된 거래는 위조될 수 없습니다. 이 때 아직그리고그리고

    , CHECKSIG를 실행하면 서명자가 주소에 해당하는 개인 키를 가지고 있는지 확인하여 디지털 서명의 정확성을 확인합니다.

    개인키를 가지고 있는 사람 외에는 누구도 디지털 서명을 위조할 수 없으며, 현재까지 비트코인 ​​P2PKH 거래가 안전하게 완료되었습니다.

    다시 설명합니다. Bob이 Alice가 준 비트코인을 사용하고 싶을 때 Bob은 Alice가 남긴 금고를 올바른 키로만 열고 Bob을 위해 새로 만든 금고에 돈을 넣을 수 있습니다.

    이때 일부 현명한 독자는 세부 사항을 알아차릴 것입니다. Bob이 키를 꺼내면 블록체인의 모든 광부는 금고를 열기 전에 키의 모양을 볼 수 있으며 이론적으로 즉시 복사할 수 있습니다. Bob에게 안전합니다(일반적으로 Front-running 공격으로 알려짐). 정말 가능합니까? 분명히 Satoshi Nakamoto는 이 문제를 고려했으며, 이 키의 트랜잭션 서명은 Bob이 시작한 트랜잭션의 완전한 서명입니다. Bob이 Alice가 구축한 금고에 비트코인을 넣어 새로운 금고(찰리를 위한)에 넣고자 한다고 가정하자. 이때 Bob이 제시한 키에는 Charlie의 공개키 Hash가 포함되어 있다. 채굴자는 Bob의 키를 복사할 수 있지만 키 다음 새 금고의 정보가 숨겨졌으므로 채굴자는 이 복제 키를 사용하여 다른 작업을 완료할 수 없습니다(디지털 서명을 횡령할 수 없음).

    P2SH - 포스트 사토시 시대의 주요 혁신

    Satoshi Nakamoto는 이러한 강력한 스크립트 시스템을 설계했으며 이체 거래를 구성하는 데만 사용하는 것은 너무 낭비인 것 같습니다.

    OP_HASH160

    OP_EQUAL

    예를 들어 해시 사전 이미지를 사용하여 트랜잭션 잠금을 해제하는 스크립트를 구성할 수 있습니다.이 스크립트의 의미는 Hash160(Pre-image)==가 충족될 때입니다.

    이 조건이 충족되면 스크립트를 성공적으로 잠금 해제할 수 있습니다.

    우리는 금고의 예를 계속 사용하고 이러한 유형의 금고에 3유형 금고라는 이름을 부여합니다. 이제 Bob에게 Alice의 비트코인은 위의 Hash160으로 보호되는 금고에 잠겨 있습니다. 이를 해시 잠금이라고 하겠습니다.

    이 자물쇠는 여전히 올바른 모양이 열려야 하지만 보안이 훨씬 취약합니다. 디지털 서명 메커니즘이 없기 때문에 열쇠에 숨겨진 키 정보가 Bob의 새 금고와 함께 변경되지 않습니다. 모든 채굴자는 Bob이 키를 보여주는 순간 정확히 동일한 키를 복사하고 Alice가 Bob에게 남긴 금고(Front-running)를 서둘러 열고 다른 사람인 Eve에게 코인을 전송할 수 있으므로 원래 Bob Bitcoins의 코인은 약탈 당할 것입니다.

    이 스크립트는 매우 안전하지 않지만 매우 마법 같은 두 가지 기능이 있습니다.

    1. 트랜잭션 구조의 출력이 충분히 짧습니다. 즉, 비트코인 ​​노드가 유지 관리하는 UTXO 캐시가 차지하는 공간이 크게 줄어듭니다.

    2. 사전 이미지는 트랜잭션이 소비될 때 항상 입력으로 참조되며 트랜잭션의 출력 측에 표시되지 않습니다.UTXO는 간소화된 상태로 유지되며 처리 수수료 부담은 수신자에게 전가될 수 있습니다.

    설명된 출력 스크립트에는 많은 이점이 있으므로 이 트랜잭션을 안전하게 만들 수 있는 방법이 있습니까? 이를 위해서는 P2SH가 무엇인지에 대해 이야기해야 합니다.

    Bitcoin Core 개발자인 Gavin Adresen은 Pay to Script Hash(P2SH)라는 기술을 제안했습니다.