💡Flow Update (2023.04.29)
클라이언트에서 노트를 생성한 시점에 백업을 시도하도록 업데이트 되었습니다.
Last updated
클라이언트에서 노트를 생성한 시점에 백업을 시도하도록 업데이트 되었습니다.
Last updated
We don't have a English translation for this page yet. Sorry! 이 페이지에 대한 영어 번역이 아직 준비되지 않았습니다.
최근 토닉 팀은 특정 환경에서 토닉 컨트랙트를 통해 자산을 입금할 때, 입금 트랜잭션이 블록체인 상에서 정상적으로 실행되었음에도, 해당 자산을 수령(출금)할 때 사용할 수 있는 노트(note)가 프론트엔드 앱에서 보여지지 않는 현상에 대한 오류를 제보받았습니다.
토닉 첫 출시 시에는, UX Flow 개선을 위해 생성된 노트를 바로 사용자에게 보여주지 않고, 입금 트랜잭션이 블록체인에 기록된 것이 확인되어야 보여주는 결정을 했습니다.
그래서, 다음과 같은 이유로 해당 이슈가 발생했는데요:
트랜잭션이 전파(broadcast)되고 난 뒤 바로 탭(또는 브라우저)을 닫거나,
클라이언트 쪽의 네트워크 문제가 발생하거나,
사용 중이신 RPC 노드에 일시적인 문제가 발생하여 실제로 트랜잭션이 전송되었음에도 에러가 반환되는 등
기타 여러 요인에 의해, 트랜잭션 상태가 실제와 다르게 보고되는 문제가 발생한 경우, 토닉의 프론트엔드 앱은 해당 트랜잭션이 정상적으로 submit/revert 된 것으로 보고, 노트 모달을 표시하지 않는 것이였습니다.
💡 토닉 팀은 프론트엔드 앱에 단계적인 패치를 적용, 최종적으로는 노트 생성 시점에 바로 노트를 백업할 수 있게 함으로써 문제를 해결했습니다. 해당 버전은 2023년 04월 29일 밤에 배포되었습니다.
토닉 팀은 꼼꼼한 확인을 거쳐 문제를 경험/제보해 주신 사용자, 키니네(가명)님께는 보상 및 사례를 지급해 드렸습니다. 진행 과정은 아래 CS 1 에서 확인하실 수 있습니다.
다시금 프론트엔드 앱을 업데이트했습니다.
배경:
CS 1 에서 진행한 패치가 1) 궁극적인 해결책이 아니라 브라우저 저장소에 의존하는 방식이였던 점, 2) 몇몇 한계를 지니는 임시적인 해결책이였던 점, 3) 그리고 특정 환경에서 노트 백업이 정상적으로 작동하지 않는 점 등으로 인해 새로운 패치를 진행했습니다.
패치 내용:
노트 생성 시점에도 바로 다른 모달을 띄워 노트를 백업할 수 있도록 합니다. (아래 CS 1 의 #1(기존 플로우) 참고)
안전을 위해 노트 생성 및 입금 트랜잭션이 확인된 후에 각각 노트를 txt 파일로 자동 다운로드 하는 것을 시도하도록 합니다. (기존에는 입금 트랜잭션이 확인된 후에만 자동 다운로드 되었습니다.)
CS 1 에서 진행된 패치는 보안을 위해 롤백했습니다. (단, 기존에 백업된 노트는 브라우저 저장소 안에 남아 있게 됩니다.)
한계:
없음
추후 업데이트 방향:
로딩 창에 브라우저 및 탭을 종료하지 말라는 메시지를 추가하겠습니다.
키니네님 안녕하세요! 토닉 팀입니다. 먼저 프로토콜을 사용해주셔서 진심으로 감사드립니다.
네이버 및 구글 이메일을 사용해서 각각 한 번씩 문의를 남겨주셨네요! 지갑 주소와 트랜잭션 해시 등, 자세한 내용을 함께 보내주셔서 빠르게 지원할 수 있었습니다. 꼼꼼한 내용 확인 감사드립니다!
본 이메일은 1) 키니네님의 지메일 주소를 공개참조(CC)하여 2) 네이버 이메일로 보내주신 메일에 회신하는 방식으로 전송드리는 점 참고바랍니다.
말씀하신 내용을 조합해 보니, 입금(Deposit) 트랜잭션 실행이 완료되었음에도 불구하고, UI에서 해당 입금과 연동된 노트(메모)가 표시되지 않은 상황으로 보입니다. 선의를 가지고 프로토콜에 기여하셨는데 이런 에러가 발생해서 많이 당황하고 놀라셨을 것 같습니다.
TL;DR: 결과적으로 말씀드리자면, 토닉 팀은 키니네님께서 제보해주신 문제를 확인했고, 이에 대한 대안이 추가된 프론트엔드 앱(클라이언트)을 새로 배포했습니다. 기술적인 한계로 노트가 없다면, 키니네님께서 입금하신 자산을 반환하거나 환불하는 것은 불가능하나, 문제 경험 및 제보에 대한 사례금으로, 토닉을 통해 _____ KLAY를 수령하실 수 있는 노트를 본 메일에 첨부하여 지급해 드리고자 합니다!
먼저, 토닉은 다음과 같은 방식대로 동작합니다:
브라우저에서 특정 규칙에 따라(추후 수령 시 식별이 가능한 형식에 따라) 랜덤한 해시를 생성 (- 이 해시를 노트라고 합니다!)
즉, 노트 정보 자체는 1번 단계에서도 존재합니다.
노트는 3가지 정보로 구성됩니다:
무작위로 생성된 비밀 값(secret)
무효화 값(nullifier)
노트의 사용자가 자산 정보 및 체인 ID 등을 쉽게 확인하기 위해 돕는 식별자
블록체인에 자산을 입금하고, 함께 노트를 기록
이 경우에도 노트에 대한 모든 정보가 기록되는 것이 아니라, 해싱된 값(commitment)이 기록되게 됩니다. (힌트: 모두가 블록체인에 올라가는 데이터를 볼 수 있기 때문에 단방향 암호화한 값을 올려야만 합니다.)
이때부터 해당 노트 정보가 블록체인에 의해 인지(acknowledge)되며, 가치를 지니게 됩니다.
트랜잭션이 충분히 섞이길 대기
노트를 가진 출금자는 이를 블록체인에 제출(2단계에서 넣은 자산에 대한 증명)하여, 출금이 가능
위와 같은 방식으로 입출금이 이루어집니다. 그렇기 때문에:
노트에 대한 정보는 전 과정에서 토닉 팀을 포함한 제 3자나 외부 서버 등으로 공유되지 않을 뿐더러, 공유되어서도 안됩니다.
노트를 알고 있는 사람이 아니라면, 그 누구도 트랜잭션 해시를 통해서 특정 노트가 사용되었는지, 사용되지 않았는지 검증할 수 없습니다.
위와 같은 기술적 한계로 인해, 우선 사용자의 노트 분실에 대해서 (노트를 알 수 없는) 토닉 팀을 포함한 제 3자는 기본적으로 사실관계 확인이 불가능함을 안내드립니다! 단, 키니네님께서 제보해주신 문제의 경우, 팀 내부 회의를 거쳐 프론트엔드 앱(클라이언트)에 결함이 있던 것이 인정되었습니다. 여기에는 다음과 같은 맥락이 있습니다!
#1: 토닉은 UX Flow 개선을 위해 1번 단계에서 생성된 노트를 바로 사용자에게 보여주지 않고, 2번 단계에서 만들어진 트랜잭션이 블록체인에 기록된 것이 확인되어야 보여주는 결정을 하였습니다.
#2: 그렇기 때문에, 트랜잭션이 전파(broadcast)되고 난 뒤 바로 탭(또는 브라우저)을 닫거나, 클라이언트 쪽의 네트워크 문제가 발생하거나, 사용 중이신 RPC 노드에 일시적인 문제가 발생하여 실제로 트랜잭션이 전송되었음에도 에러가 반환되는 등의 여러 요인에 의해, 트랜잭션 상태가 실제와 다르게 보고되는 문제가 발생한 경우, 토닉의 프론트엔드 앱은 해당 트랜잭션이 정상적으로 submit/revert 된 것으로 보고, 노트 모달을 표시하지 않는 것이였습니다.
#3: 토닉 팀은 제품 개선을 위해서 Amplitude 라는 서비스를 사용해서 제품에 발생하는 이벤트(예: 버튼 및 링크 클릭, 트랜잭션 전송 성공 여부 등)를 트래킹하고 있습니다(참고: 당연히 이 과정에서 유저의 노트를 수집하지 않으며, 이는 Google Chrome의 DevTools 등을 통해 직접 확인이 가능합니다).
#4: 토닉 팀이 수집된 이벤트를 확인 결과, 키니네님께서 알려주신 tx 0x...
에 대한 deposit
이벤트는 (다른 모든 tx와 달리) 기록되지 않았습니다. 이 사실을 통해 #2 의 문제가 사실임을 확인할 수 있었습니다. 물론, 브라우저에서 실행되는 모든 요청은 악의적인 목적을 가진 유저에 의해 조작 가능하나(예를 들어서, 특정 이벤트가 이벤트 트래킹 사이트에 기록되지 않도록 막을 수 있습니다), 그럴 가능성은 적다고 판단했습니다.
예상하고 있지 못하다, 키니네님 제보 덕분에 인지하게 된 문제 #2 에 대한 대안을 마련하기 위해, 토닉은 다음과 같이 조치했습니다.
프론트엔드 앱을 업데이트했습니다.
패치 내용:
프론트엔드에서 노트를 생성할 때마다, 내부 저장소(localStorage)에 저장하고, 사용자가 직접 지우지 않는 한 유지합니다(물론, 시크릿 탭 등 개인정보 모드가 켜져 있는 상태에서는 작동하지 않으며, 브라우저 및 브라우저 저장소를 초기화하거나 해당 스토리지가 초기화된 경우 함께 삭제될 수 있습니다).
tonic.cash/notes
에서 확인하고 수동 삭제할 수 있게 합니다.
노트 누락이 재발생한 경우, tonic.cash/notes
에 접속하여 아직까지 해당 기기로 생성된 노트를 모두 확인하고, 누락된 노트를 찾을 수 있게 합니다.
내부 저장소에는 노트만이 저장되고, 지갑 주소 및 트랜잭션 해시가 함께 저장되지 않습니다.
본 구현은 아래와 같은 한계를 지니는 임시적인 패치이며, 장기적으로는 아래에 기술된 방향으로 업데이트될 예정입니다.
한계:
앞으로 생성되는 노트에만 적용됩니다(이는 과거 생성된 노트를 백업하지 않았다면, 알 수 있는 방법이 없기 때문입니다).
노트가 브라우저에 오래 저장되기 때문에, 악의적인 목적을 가진 확장 프로그램, 기기 탈취 등에 취약합니다.
추후 업데이트 방향:
생성된 노트를 모두 저장하는 대신, #1 에서 잠깐 언급한 플로우처럼, 노트 생성 시점마다 사용자가 백업 기회를 주는 방식으로 변경하겠습니다.
로딩 창에 브라우저 및 탭을 종료하지 말라는 메시지를 추가하겠습니다.
토닉 팀은 편의성에 안전을 희생해서는 안된다고 생각합니다. 해당 방식으로 변경하고 나서도, 사용하기 쉽고 이해하기 쉬운 인터페이스를 제공할 수 있도록 노력하겠습니다.
해당 지원 및 업데이트 사항에 대한 내용 역시 1~2 영업일 안으로 문서 및 SNS 채널 등을 통하여 커뮤니티에 공지하겠습니다! (단, 당연하게도 키니네님의 성함과 메일 주소 등은 공개하지 않겠습니다.) 물론 키니네님께서는 본 지원 내용을 얼마든지 사용하거나 공개하셔도 좋습니다.
토닉을 믿고 함께해주셔서 진심으로 감사드립니다!
토닉 팀.
추신: 입금(deposit) 및 출금(withdrawal) 사이에 다른 트랜잭션이 쌓일 수 있는 시간차를 두셔야 믹싱하실 수 있습니다! 토닉 팀에서는 익명성 셋 크기를 빠르게 넓히고자 인센티브 구조, 이벤트 등 여러 수단을 준비중이오니, 다시 한번 많은 관심 부탁드립니다!