페이지상단으로이동

사건 보고: 로투스 APIs를 사용한 정확한 부기

    • 이지원 기자
    • |
    • 입력 2021-03-25 10:21
    • |
    • 수정 2021-03-25 10:22
▲파일코인 사건 보고: 로투스 APIs를 사용한 정확한 부기

2021년 3월 18일, 파일코인의 원격 프로시져 호출(RPC) 코드에 “심각한 버그”가 발생해 ‘이중 지출’이 있었던 것으로 알려졌다. 이런 진술들은 잘못되었고 오해의 소지가 있다.

로투스 팀은 이 보고를 자세히 조사하였고 파일코인 네트워크나 RPC API 코드에 아무 문제를 발견하지 못하였다. 블록체인 자체에 이중 지출은 없었고 API 코드에 버그가 존재하지 않았다. 해당 거래소는 이미 장부상 잘못된 거래(자금 손실은 없었음)를 되돌렸고, API 사용을 바로잡기 위해 입금처리 논리를 검토하고 있다.

이슈

-이슈 보고: 오늘 오전, 로투스 팀은 거래 중 파일코인 네트워크에서 로투스 API를 사용하여 예금처리를 할 때 잘못되었다고 보고받았다. API의 잘못된 사용은 유저에 의해 발견되었고 거래 부기 시스템에 예금 이 두번이나 거래되었다. 이는 거래 장부상으로는 이것이 환원되었다 – 체인 자체에는 중복 거래가 없었다.
*bookkeeping: 부기

-API 혼선: 중심적인 문제는 로투스 체인 state inspection API의 잘못된 사용이다. 이는 다수의 비슷한 메시지들을 처리할 때 예상했던 것보다 다르게 작용했다. 로투스 API의 출력을 잘못 해석하면 부기 시스템에 원본 메시지와 대체된 메시지를 모두 동일한 발신인과 수신인으로 계산할 수 있다. 그래서 지금까지 우리는 이 거래에 영향을 받은 한 곳의 거래소만 알고 있다.

-허위 보고는 표제를 장식한다: 네트워크 상에 “이중 지불”이라는 부적절한 진술들이 소셜 미디어 채널에 전파되었고 기사 표제에 장식되었다. 이중 다수의 발언은 조사되었고 거짓으로 판결되었다. 팀은 파일코인 네트워크나 RPC API 코드에 문제를 발견하지 못하였다. 사실을 알고 난 뒤, 많은 단체와 미디어 기관들은 보도를 정정하였다.

Actions being taken (수행 중인 작업)

-교환에 영향을 미침: 해당 거래소는 의문점에 API 잘못된 사용으로 입출금 및 이체를 즉각 중지시켰다. 문제의 잘못된 트랜잭션을 반환했으며 권장된 사양을 맞추기 위해서 로투스 API를 수정하고 있다.

-분리된 예시: 다른 교환은 비상이었고 해당 코드가 영향을 받지 않는지 확인하고 있다. 이러한 검토 중 많은 리뷰들은 이미 완료되었으며, 현재로서는 이 API를 이런 방식으로 잘못 사용한 다른 교환은 없었다.

-로투스 팀: 로투스 팀은 이 문제가 올바르게 처리하기 위해 모든 교환들을 적극적으로 협력하고, 향후 파일코인 체인 상태를 다른 모든 사용자가 올바르게 검사하도록 API 문서를 개선한다.

-커뮤니티& 미디어 팀: 다수의 단체들은 출판물과 사건의 내용과 사실을 명확히 하고 다 같이 일하고 오보를 불식시키기 위해 노력하고 있다.

-커뮤니티 팀: 커뮤니티 멤버들은 실수로 잘못된 정보가 퍼지지 않고 문제를 정확하고 세세하게 보고할 수 있도록 도움이 되는 자료들을 만들고있다.

Technical Details (기술적인 세부사항)

-같은 메시지: 로투스 팀은 동일한 수신자와 발신자 세부 정보와 동일하지 않지만 서로 다른 가스 매개 변수를 가진 두 개의 메시지가 동일한 팁 세트에 포함됨에 따라 문제가 발생헀음을 알고 있다. 이와 유사한 두개의 메시지는 메시지와 관련된 가스 요금을 변경하기 위한 일반적인 메시지 교체 형식이다. 이러한 상황은 파일코인 네트워크에서 안전하고 정확히 처리되며, 두번의 거래가 이뤄지지 않도록 만들었다: 두 메시지 중 하나는 실행되고 나머지는 무시한다.

-API 잘못된 사용: 하지만, 체인을 검사하는 방법에 따라, 거래가 두번 진행되었다는 것으로 보일 수 있다. 구체적으로, 이 교환은 팁 세트의 모든 블록에서 “ChainGetBlockMessage ‘를 호출한 다음 각 메시지에 “StaeGetReceipt”로 호출하는 부정확한 체인 상태를 처리하는 방법을 사용하였다.

-API 사용의 오해: 혼동은 “StateGet Receipt”로 두개의 비슷한 메시지가 (하나는 실행되었고, 나머지는 건너뜀) 호출되면 동일한 결과를 제공한다: 이는 분명 반직관적인 행동이지만 의도된 행동이다. StateGetReceipt 방법의 기본 사용 사례는 로투스 마이너에서 사용하는 이벤트 처리기와 딜 메이킹 과정에 있다. 메시지가 대체될 경우, 이러한 모듈들은 반환된 영수증이 원본 메시지와 일치하는지 아니면 대체 메시지와 일치하는지 여부에 상관하지 않는다. 즉, 메시지가 체인에서 성공적으로 실행되었는지 알고 싶을 뿐이다. 우리는 여기에 설명서를 추가하였다: https://github.com/filecoin-project/lotus/pull/5838.

-올바른 API 사용: 대부분의 교환은 “ChainGetParentMessages”와 “ChainGetParentReceipts”올바르게 사용하고 장부에서 어떤 메시지가 실행되었고 체인에서 성공했는지 알아낸다. 상태 계산 중에 로투스 자체에서 사용하는 API이므로, 사용자는 체인 상태를 이러한 방식으로 올바르게 반영할 수 있다. 각 메시지에 대해 “StateReplay’를 수행하면 전체 호출 결과가 제공되므로 반환된 “InvocResult”의 MsgCid 와 쿼리된 메시지의 CID를 비교할 수 있다. 이 경로는 교환이 체인 상태를 올바르게 검사하고 내부 보고 시스템을 동기화하기 위한 권장 경로이다.

더욱 다양한 정보 및 방송 관련 소식은

공식 SNS 채널을 통해 확인 가능합니다.

이지원 기자 | [email protected]

댓글 [ 0 ]
댓글 서비스는 로그인 이후 사용가능합니다.
댓글등록
취소
  • 최신순
닫기