Filecoin "이중 지불 사건" 회고: 거래소 회계 부정확
이 문서는 Filecoin Network에서 가져온 것입니다.
2021년 3월 18일, Filecoin의 원격 프로세스 호출(RPC) 코드에 "심각한 취약점"이 있어 "이중 지불"이 발생했다는 보도가 있었습니다. 이러한 주장은 부정확하며 강한 오해를 일으킵니다.
Lotus 팀은 해당 보고서를 철저히 조사했으며, Filecoin 네트워크와 RPC API 코드와 관련된 문제를 발견하지 못했습니다. 블록체인 자체에는 이중 지불 문제가 없으며, API 코드에도 오류가 없습니다. 관련 거래소는 잘못된 거래 기록을 수정하였고, API 사용을 수정하기 위해 그들의 회계 시스템에서 충전 처리 로직을 검토하고 있습니다.
사건 개요
사건 보고 --- 오늘 아침, Lotus 팀은 거래소가 Filecoin 네트워크에서 송금/입금을 계산하기 위해 Lotus API를 잘못 사용했다는 보고를 받았습니다. API의 잘못된 사용은 사용자가 거래소에 그들의 계정이 거래소 회계 시스템에 의해 잘못 반복 기록되었다고 보고한 데서 비롯되었습니다. 이 문제는 거래소 회계 시스템에서 복구되었으며 --- 블록체인 자체에는 반복 기록이 없습니다.
API 오해 --- 이 문제의 핵심은 Lotus의 체인 상태 확인 API의 잘못된 사용으로, 여러 유사한 메시지를 처리할 때 기대한 것과 다른 방식으로 처리됩니다. Lotus API의 출력을 오해하면 회계 시스템이 원래 메시지와 대체 메시지를 동일한 송신자와 수신자로 간주하게 됩니다. 현재까지 이 문제의 영향을 받은 거래소는 하나뿐입니다.
허위 보도가 기사 제목으로 --- 네트워크 "이중 지불"에 대한 부정확한 주장이 소셜 미디어 채널에서 퍼져 기사 제목에 포함되었습니다. 이러한 보도의 내용은 조사되어 잘못된 정보로 확인되었습니다. 팀은 Filecoin 네트워크나 RPC API 코드에 문제가 없음을 발견했습니다. 사실을 알게 된 후, 많은 팀과 미디어 기관이 그들의 보도를 수정하고 있습니다.
취해진 조치
영향을 받은 거래소 --- 관련 거래소는 API의 잘못된 사용을 발견하고 즉시 조치를 취하여 충전, 출금 및 송금을 중단했습니다. 그들은 관련된 잘못된 거래를 복구했으며(따라서 이번 사건에서 자금 손실은 없었습니다), Lotus API의 사용을 권장하는 방법에 맞게 수정하고 있습니다.
우발 사례 --- 다른 거래소는 경고를 받고 그들의 코드 로직을 검토하여 동일한 오류의 영향을 받지 않도록 하고 있습니다. 그 중 많은 검토가 완료되었으며 ------ 우리가 아는 한, 현재까지 다른 거래소는 이러한 방식으로 API를 잘못 사용한 적이 없습니다.
Lotus 팀 --- Lotus 팀은 모든 거래소와 적극적으로 협력하여 이 행동을 올바르게 처리하고 API 문서를 개선하고 있습니다(https://github.com/filecoin-project/lotus/pull/5838), 모든 다른 거래소가 Filecoin의 체인 상태를 올바르게 확인할 수 있도록 보장합니다.
커뮤니티와 미디어 --- 일부 팀은 공동으로 노력하여 미디어와 연락을 취하고 사건의 세부 사항과 사실을 명확히 하며 잘못된 정보를 제거하는 데 도움을 주고 있습니다.
커뮤니티 팀 --- 커뮤니티 구성원은 다른 커뮤니티 구성원이 문제를 정확하고 신중하게 보고할 수 있도록 도와주는 방법을 제공하여 잘못된 정보의 우발적 전파를 피하도록 하고 있습니다.
기술 세부 사항
동일한 정보 --- Lotus 팀이 아는 바에 따르면 문제는 두 개의 메시지가 동일한 송신자/수신자 세부 정보, 동일한 nonce를 가지고 있지만 서로 다른 Gas 매개변수를 가지고 있어 ------ 동일한 tipset에 포함된 경우에서 발생합니다. 이렇게 두 개의 유사한 메시지는 매우 흔하며, 예를 들어 메시지의 Gas 비용을 변경하여 메시지를 대체하는 경우 이러한 두 개의 유사한 메시지가 생성됩니다. 이러한 상황은 Filecoin 네트워크가 안전하고 올바르게 처리하며, 두 번의 송금이 발생하지 않도록 합니다: 두 메시지 중 하나는 실행되고 다른 하나는 무시됩니다.
API 잘못 사용 --- 그러나 사람들이 체인을 검사하는 방식에 따라 메시지가 두 번 처리된 것처럼 보일 수 있습니다. 구체적으로, 관련 거래소는 체인 상태를 잘못 처리하는 방식을 사용했습니다 ------ tipset의 각 블록에서 ChainGetBlockMessages를 호출한 다음 이러한 메시지에서 StateGetReceipt를 호출했습니다.
잘못된 API 기대 --- 오류를 유발하기 쉬운 부분은 StateGetReceipt가 두 개의 유사한 메시지에서 호출될 때(하나는 실행되고 다른 하나는 건너뛰어짐) 동일한 결과를 제공하여 두 메시지가 모두 실행된 것처럼 느끼게 한다는 것입니다. 이는 직관에 반하는 행동이지만 의도적으로 이루어진 것입니다. StateGetReceipt의 주요 사용 사례는 Lotus 채굴자와 거래 처리 과정에서 사용되는 이벤트 처리 프로그램입니다. 메시지가 대체된 경우, 이러한 모듈은 반환된 정보가 원래 메시지에 해당하는지 아니면 대체된 메시지에 해당하는지에 대해 신경 쓰지 않습니다 ------ 그들은 단지 메시지가 체인에서 성공적으로 실행되었는지를 알고 싶어합니다. 우리는 여기 문서에 명확성을 추가했습니다: https://github.com/filecoin-project/lotus/pull/5838.
올바른 API 사용 --- 대부분의 거래소는 ChainGetParentMessages와 ChainGetParentReceipts를 올바르게 사용하여 회계 처리를 하여 체인에서 어떤 메시지가 실행되었고 어떤 메시지가 성공했는지를 계산했습니다. 이러한 API는 Lotus 자체가 체인 상태 계산 과정에서 사용하는 API로, 사용자가 이러한 방식으로 체인 상태를 올바르게 반영할 수 있도록 보장합니다. 각 메시지에 대해 StateReplay를 실행하면 전체 호출 결과를 얻을 수 있으며, 사용자는 반환된 InvocResult의 MsgCid와 쿼리 메시지의 CID를 비교할 수 있습니다. 이는 거래소가 체인 상태를 올바르게 확인하고 내부 보고 시스템을 동기화하는 데 권장되는 단계입니다.