회사 웹사이트 홍보하는 채널 – Telegram
Forwarded from 캘빈의 감금원
로빈후드의 토큰화 주식 컨트랙트를 뜯어봤더니 transfer마다 목적지의 KYC/AML을 검수하도록 구현되어있었다고 하네요. 디파이에 쓰라고 만든 토큰은 아닌 것으로 보입니다.

그렇다면 주식을 탈중앙화된 형태로 거래할 수 있도록 만든다기보다는 블록체인이라는 인프라에 얹어놓은 느낌이 조금 더 강하네요. 과연 로빈후드가 출시할 새로운 L2는 어떤 형태를 띌지..

참고 트윗: https://x.com/0xren_cf/status/1940077604939129253
특정 컨트랙트의 세부 디테일을 확인하는 꿀팁!

이미지와 같이 컨트랙트의 세부 사항을 알아보기 힘들 때는 아래의 사이트를 이용하면 쉽습니다!

https://app.dedaub.com/decompile

해당 사이트에 이미지에 보이는 바이트코드를 입력하면 코드의 구성을 알 수 있다는 사실!
1
로빈후드는 정말 러그를 치려고 했던 것일까?

나름 주요 화두에 오른 것 같아서 컨트랙트를 바탕으로 해당 의도를 분석해보았습니다
글은 가능성을 담고 있는 것이니 해당 부분 유의 부탁드립니다


현재 화두가 된 "로빈후드의 SpaceX 토큰과 주식 러그 사건"의 간략한 요약은 다음과 같습니다

1. 로빈후드에서 토큰을 발행하고
2. 로빈후드 대표가 본인 계정에 트랜잭션이 성공했다는 글을 올리고
3. 유니스왑 LP를 만들었다가
4. 토큰을 전량 소각하였음


이렇게만 보았을 때는 과거 게임스탑 사례를 떠올리며
얘네들은 악의적인 의도를 가졌을 것이다

는 추론을 하기 쉬워보입니다

과연 정말로 그들은 악의적인 의도로 사람을 속이기 위해 준비한 것일까요?
1
의도를 100% 파악할 수는 없겠지만 토큰을 발행하는 과정을 바탕으로 짐작해보려고 합니다

로빈후드가 짜놓은 컨트랙트의 전체적인 구성은 다음과 같습니다

1. Factory Layer

a) Factory Proxy
- Implementation을 가리키는 주소
- 업그레이드를 위한 구조

b) Factory Implementation
- 진짜 Factory 로직이 들어있는 주소
- deploy() 같은 함수가 포함되어있음

2. Token Layer

a) Token Proxy
- Factory Proxy를 통해 deploy된 주소

b) Beacon Proxy
- Token Proxy가 가리키는 또 다른 proxy 주소
- 아래의 Implementation으로 이어짐

c) Token Implementation
- 진짜 로직이 들어있는 주소
- transfer(), transferShares()와 같은 함수가 들어있음
1
왜 이렇게 구성하였는가?에 대한 답변으로는

1) 업그레이드 유연성을 확보하고
2) 하나의 Logic을 공유하지만
3) 각 Token에 대한 개별 storage를 확보하기 위함

이라고 추론해볼 수 있습니다

토큰을 편하게 찍어내면서 관리도 편하게 하는, 그들이 최근 준비하고 있는 RWA 토큰화에 부합하는 로직입니다

트위터에서는 '전량 소각 기능을 숨겨놓았다'는 이야기가 오고가는 것 같았지만 Token Implementation의 Write에서 확인할 수 있기도 하였죠
1
로빈후드는 지속적으로 실험을 하고 있으며 그들을 이해하려고 생각한다면 어느 정도 합리적인 면도 있어보입니다

1. 토큰을 좀 찍어봐야하니까
2. 그렇게 찍은 토큰에 대한 LP를 형성해보긴 해야하니까
3. 실제로 연계하여 만든 것까진 아니라서 없애야하니까
4. 그리고 테스트 토큰이라고 적어두기도 했으니까
2
하지만 이해가 안되는 부분은 여전히 존재합니다

근데 왜 저걸 메인넷에서 진행하였는가?


일반적으로 컨트랙트를 발행하고 수정하고 테스트하는 것은 테스트넷에서 진행을 하곤 합니다
굳이 메인넷에서 테스트할 이유가 없기 때문입니다

그렇지만 로빈후드는 Deployer 계정으로는 테스트넷에서 트랜잭션을 찍은 기록이 없습니다

그렇다고 로빈후드가 테스트넷이 뭔지 모르는 거래소라고 이야기하기엔 토큰을 발행하는 구조가 너무나도 짜임새가 있어보입니다

왜 그들이 '메인넷'에서 테스트를 진행하고 있는지는 알 수 없지만 이 때문에 피해를 입은 사람에게는 보상을 해주어 시장 참여자들에게는 신뢰를 잃지 않기를 바랍니다
4
GMX 해킹 요약

GMX 구조

퍼프덱스인 GMX는 Vault의 AUM을 바탕으로 GLP 가격을 결정함

GLP price = AUM / Total GLP


이 때, Vault AUM을 계산할 때 다음이 포함됨

globalShortSizes[token]
globalShortAveragePrices[token]


즉, 숏 포지션을 여는 것으로 GLP 가격을 조작할 수 있다는 것이 문제의 원인이 되었음


탈취 흐름

아래의 함수들은 GMX Exploiter가 생성한 컨트랙트 0x7d3bd50336f64b7a473c51f54e7f0bd6771cc355에서 확인할 수 있음

1. 낮은 가격으로 초기에 숏 포지션을 생성하고 조건 체크
function fallback() public payable {  find similar
if (!(msg.sender - _gmxPositionCallback)) {
v0, /* uint256 */ v1 = _uniswapV3FlashCallback.getGlobalShortAveragePrice(stor_8_0_19).gas(msg.gas);
require(bool(v0), 0, RETURNDATASIZE()); // checks call status, propagates error data on error
...

» 해당 fallback을 통해 globalShortAveragePrice와 max price를 비교하여 조건 충족 시 uniswapV3FlashCallback 실행

2. uniswapV3FlashCallback 실행
...
v2, /* uint256 */ v3 = stor_3_0_19.mintAndStakeGlp(varg1, varg0, 0, 0).gas(msg.gas);
require(bool(v2), 0, RETURNDATASIZE()); // checks call status, propagates error data on error
MEM[64] = MEM[64] + (RETURNDATASIZE() + 31 & 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0);
require(MEM[64] + RETURNDATASIZE() - MEM[64] >= 32);
return v3;
}

uniswapV3FlashCallback에 포함된 함수를 통해 낮은 가격에서 mintAndStakeGlp

function 0x35b0(address varg0, uint256 varg1, address varg2) private { 
v0, /* uint256 */ v1 = stor_3_0_19.unstakeAndRedeemGlp(varg2, varg1, 0, varg0).gas(msg.gas);
require(bool(v0), 0, RETURNDATASIZE()); // checks call status, propagates error data on error
MEM[64] = MEM[64] + (RETURNDATASIZE() + 31 & 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0);
require(MEM[64] + RETURNDATASIZE() - MEM[64] >= 32);
return ;
}

높은 가격에서 unstakeAndRedeemGlp

이를 바탕으로 GMX TVL의 약 10%에 해당하는 40M을 탈취하였으며 GMX 토큰 자체의 가격은 약 30%의 하락을 보임

탈취 자금을 DAI, ETH의 형태로 전환한 것을 바탕으로 현재까지는 자금을 돌려줄 생각은 없는 것으로 판단됨
4
상장하는 코인을 미리 알 수는 없을까?

다들 한 번 쯤은 해봤을법한 생각일거라 온체인에 찍힌 기록을 바탕으로 업비트 사내 상장 시스템을 알아볼까해요

1. 지갑 파기

업비트는 알트코인별로 지갑을 두는 편이에요
따라서 100만개의 코인이 상장되어있다면 '최소' 100만개의 지갑을 가지고 있다고 보시면 된답니다

좀 더 세부적으로 들어가면 기능에 따라(sweep, withdraw, storage) 좀 더 나뉘긴하지만 막 그리 중요하진 않으니 패스!

2. Funding

위에서 언급하였듯이 여러 지갑을 가지고 각각은 각각의 기능을 가지기 때문에 소량의 이더리움을 넣어두어 활성화를 준비해요
(여기서부턴 트랜잭션을 기반으로 한 추정이 들어가니 유의해주세요)

아마 업비트 리스팅팀에다가 '곧 상장할테니 세팅해놔'라고 이야기하면 그렇게 이더리움을 전송해두는 것이 아닐까 생각이 들어요

이때, 업비트는 테스트용 입금을 꼭 해보는 편인데 테스트용 입금을 하는 Funder address를 트래킹한다면

"곧 뭔가를 상장하겠구나"

정도는 추정할 수 있답니다

3. 공지 올리고 지갑 활성화하기

해당 준비가 끝나면 공지를 올리는 것 같아요
그리고 해당 공지가 올라간 직후 위의 지갑들이 매우 분주하게 활성화되기 시작해요
특성 주소는 물량을 공수해오고 특정 주소는 해당 지갑에서 입출금이 잘 되는지 확인해요
세번째 사진 이후부터 확인할 수 있는 wallet activator가 그에 해당한답니다

테스트용 sweep을 진행해보고 잘 작동하면 다른 deposit에 대해서도 진행을 시작해요

4. 거래 개시하기

이젠 온체인에서 추가적으로 진행되는 특별한 일은 없어요
이후론 펌핑을 기다리며 기도를 할 시간이 되는 것이지요


그래서 결론이 무엇이냐? 무슨 코인 상장하는지 어떻게 아냐?고 물으신다면

1) 상장 시기는 대충 예상해볼 수 있지만
2) 상장 코인을 아는 것은 매우 어렵다

정도로 답변할 수 있겠네요

업비트 상장 시스템에 대해 풍문으로 들었을 때

'상장팀이 어느 정도 선별해두고 코인 잘 모르시는 높은 분이 그 중에서 골라서 상장한다'

고 들은 바가 있는데 트랜잭션들을 바탕으로 실제로 그 모습과 유사할 가능성이 높다고 생각이 들었답니다!
15👍4❤‍🔥2
저번에 이야기하던 '업비트 원상 시기'에 관한 글 기억나시나요?

메이플을 상장하기 위해 지갑을 팔 때 총 3개의 지갑이 생성되었는데요, ①번은 메이플 상장용으로 사용되었고 ②번③번은 여전히 빈 지갑으로 남아있네요


오늘 이미 OP 상장이 진행되긴 했지만 금주에 추가적으로 ERC-20 토큰이 상장할 가능성이 높다고 보는 것은 귀납적으로 합리적인 판단이 될 수 있을 것 같지 않나요?