MetaMask Snaps는 MetaMask를 세계에서 가장 확장 가능한 지갑으로 만들기 위한 로드맵입니다. 개발자로서 완전히 새로운 방식으로 MetaMask에 기능과 API를 추가할 수 있습니다. Web3 개발자들은 이러한 성장의 핵심이며, 이 시리즈는 현재 개발 중인 혁신적인 MetaMask Snaps를 소개하는 것을 목표로 합니다.
Blackbelt Snap
Snap 저장소: https://github.com/s-a-malik/blackbelt
왜 만들었나요?
블록체인에서의 상호작용을 최종 사용자에게 더 안전하게 만들고 싶었습니다. 특히 사기와 익스플로잇의 피해자가 될까 두려워하는 신규 사용자나 기술에 익숙하지 않은 사용자들을 위해서입니다. 이를 위해 스마트 컨트랙트 상호작용에 대한 실시간 위험 평가를 제공하는 방법을 고안했습니다.
기술적 구현에 대해 설명해 주시겠어요?
기술 구성
Blackbelt는 세 가지 요소로 구성됩니다: 서버, MetaMask snap, 그리고 웹사이트 프론트엔드입니다. 서버는 데이터를 가져오고 스마트 컨트랙트 위험 점수를 계산합니다. MetaMask snap과 웹사이트는 서버를 호출하고 https 요청 내에 특정 컨트랙트 주소를 제공합니다. 프로젝트의 전체 구현은 여기에서 확인할 수 있습니다.
서버
서버는 보안 점수와 메타데이터를 json 형식으로 반환하는 Flask 백엔드로 구성됩니다. /security_score 경로에 GET 요청이 시작되면 security_score() 함수가 호출됩니다. 먼저 컨트랙트 주소, 사용자 주소, 체인 ID, 호출자 출처 등 제공된 모든 파라미터가 언패킹된 후, 온체인 데이터를 가져오고 여러 변수(예: 컨트랙트 연령)에 대한 보안 점수를 계산하는 compute_security_score(contract_address, chain) 함수로 부분적으로 파싱됩니다. MetaMask Snaps 내에서 데이터 검색 속도를 높이기 위해, MetaMask Snaps를 통해 서버가 호출될 때 가능한 경우 캐시된 결과를 제공합니다(변수 is_snaps 참조).
def security_score():
"""
Returns the security score and the metadata used to compute it for a given contract address.
Saves result to ipfs and local storage.
Params:
- user_address: the address of the user to check
- contract_address (str): eth address of the contract
- chain_id (int): chain to check the contract on
Returns:
- score (int): The security score (0-100)
- contract_info (dict):
"""
user_address = request.args.get('user_address', type=str)
contract_address = request.args.get('contract_address', type=str)
chain_id = request.args.get('chain', default=1, type=int)
is_snaps = request.args.get('is_snaps', default=False, type=str)
is_snaps = True if is_snaps == "true" else False
if is_snaps and contract_address in contract_to_score:
return contract_to_score[contract_address][0]
else:
chain = "mainnet" if chain_id == 1 else "goerli"
output = compute_security_score(contract_address, chain)
if output["status"] != "ok":
return output
contract_to_score[contract_address].append(output)
user_to_transactions[user_address].append(output)
return output
compute_security_score 함수(logic.py 파일 내)는 Coinbase Cloud API, Etherscan API, 그리고 신고된 악성 주소에 대한 자체 커뮤니티 큐레이션 서버 측 데이터베이스의 온체인 데이터를 기반으로 휴리스틱 위험 점수를 계산합니다. 점수 계산에 사용되는 요소 유형의 몇 가지 예시가 아래 코드 스니펫에 나와 있습니다. 예를 들어, 컨트랙트가 Etherscan에서 검증 및 감사된 것으로 선언되었는지, 그리고 컨트랙트의 연령을 확인합니다.
verified = is_verified(contract_address, chain)
audited = is_audited(contract_address, chain)
transactions, users, deployed_date_unix = numberOfTransactionsAndUsersAndAge(contract_address)
min_age_of_contract_in_days = (time.time() - deployed_date_unix) / 86400
num_times_reported = blacklist_dict[contract_address]
향후에는 악성 컨트랙트를 식별하는 데 도움이 될 수 있는 더 많은 정보 소스(자동화된 검증 도구 및 기존 블랙리스트 데이터베이스 등)를 통합하고, 머신러닝 방법을 활용하는 등 위험 점수의 보다 정교한 계산 방식도 도입할 계획입니다.
Snap
Snap에는 트랜잭션이 발생할 때마다 트리거되는 트랜잭션 인사이트 API를 사용합니다. Snap은 네 단계로 구성됩니다. 첫째, 트랜잭션 구조체에서 트랜잭션 핵심 세부 정보를 가져옵니다. 둘째, 트랜잭션 세부 정보를 서버로 전송하고 보안 점수와 메타데이터를 가져옵니다. 셋째, 요청 상태를 확인하고 오류를 처리합니다. 넷째, MetaMask Snaps 내에서 보안 점수와 메타데이터를 json 객체로 반환합니다.
export const onTransaction: OnTransactionHandler = async ({
transaction,
chainId,
}) => {
const user_address = transaction.from;
const contract_address = transaction.to;
const chain_id = chainId.split(":")[1];
const url = 'https://blackbelt.xyz/security_score?contract_address='+contract_address+'&user_address='+user_address+'&chain='+chain_id+'&is_snaps=true';
let x = await fetch(url);
let data = await x.json();
if (data.status == "ok"){
const individual_scores = stringify_json('individual_scores', data)
const individual_details = stringify_json('contract_info', data)
return {
insights: {"Risk Assessment": data.risk_level, "Security Score": data.security_score, "Recommendation": data.recommendation, "Details": individual_details, "Individual Scores": individual_scores, "Assessment Timestamp": data.risk_assessment_timestamp, "IPFS Storage Hash": data.ipfs_hash},
};
} else if(data.status =='error, not a contract address'){
return {
insights: {"No Score Available": "No interaction with a smart contract detected.", "Assessment Timestamp": data.risk_assessment_timestamp},
};
} else if(data.status =='error, unsupported chain'){
return {
insights: {"Chain Not Supported": "We are currently supporting Ethereum and Goerli only. We are working on adding more networks."},
};
} else {
return {
insights: {"Unknown Error": "An unknown error occured. Please contact the team and try again later."},
};
}
};
웹사이트
웹사이트는 React로 작성되었으며, MetaMask에 기능을 추가하기 전에 빠르게 테스트하는 데 사용됩니다. 사용자는 컨트랙트 주소를 입력하고 "지금 평가하기"를 눌러 기능을 사용해 볼 수 있습니다. 애플리케이션이 마음에 든다면 오른쪽 상단의 "MetaMask Snap 추가"를 클릭하여 MetaMask에 추가할 수 있습니다.
실제로 구현한다면 다음 단계는 무엇인가요?
다음 단계는 위험한 컨트랙트를 더 안정적으로 감지하기 위해 백엔드와 분석 역량을 개선하는 것입니다. 현재 평가는 DAU 수나 트랜잭션 수(많을수록 좋음)와 같은 휴리스틱을 기반으로 하지만, 위험 점수를 더 정확하게 계산하기 위해 머신러닝과 같은 고급 기법을 포함하고 싶습니다. 분석 기능을 개선한 후에는 가능한 한 원활한 사용자 경험을 제공하기 위해 전체 위험 평가 프로세스의 속도를 높이는 데 집중할 것입니다. 이는 캐싱이나 더 빠른 데이터 검색 절차를 통해 구현할 수 있습니다.
본인과 팀에 대해 간략히 소개해 주시겠어요?
저희는 옥스퍼드 대학교 박사 과정 학생 세 명과 옥스퍼드 졸업생 한 명으로 구성된 팀입니다. 옥스퍼드 블록체인 소사이어티와 연계되어 있으며, ETHBogota 해커톤에서 만나 팀을 결성했습니다.
Lucas Schneider: Lucas는 옥스퍼드 대학교 컴퓨터 과학과 DPhil 후보생으로, CRISPR 시스템에서 유전자 편집 결과를 예측하는 계산 및 머신러닝 모델에 집중하고 있습니다. DPhil 시작 전에는 런던 Barclays 투자은행의 유동화 상품 구조화 그룹에서 애널리스트로 근무하며 다양한 특수 구조화 신용 거래 및 부실 대출과 상업용 부동산 포트폴리오 금융에 참여했습니다. 런던 정치경제대학교(LSE)에서 금융학 석사 학위를, Friedrich-Alexander University Erlangen-Nuremberg에서 계량적 방법론에 중점을 둔 경제학 학사 학위를 취득했습니다.
Shreshth Malik: Shreshth는 옥스퍼드 대학교 머신러닝 DPhil 후보생으로, 더 신뢰할 수 있는 실제 응용 프로그램을 가능하게 하기 위해 딥러닝 방법을 더 견고하고 신뢰성 있게 만드는 연구에 집중하고 있습니다. 여러 AI 스타트업과 런던 기반의 시드 단계 VC 펀드에서도 근무한 경험이 있습니다. UCL에서 머신러닝 석사 학위를, 케임브리지 대학교에서 물리 자연과학 석사 학위를 취득했습니다.
Paweł Narkiewicz: Paweł은 연쇄 창업가이자 과학자, 기술 마니아입니다. 18세에 스탠퍼드와 하버드의 저명한 수학자들과 함께 정수론 분야의 첫 번째 연구 논문을 발표했습니다. 1년 후에는 폴란드의 기술 역량 개발을 가속화하기 위한 성공적인 에듀테크 스타트업을 창업했으며, 3개월 만에 자립 경영이 가능한 사업으로 성장시켰습니다. 동시에 메드테크 스타트업에 운영 주주 및 ML 엔지니어로 합류하여 스타트업 핵심 기술 기능 개발을 이끌었습니다. 옥스퍼드, 스탠퍼드, 하버드의 최고 연구진과 직접 협력했으며, 해당 스타트업은 프리시드 라운드에서 77만 달러, 시드 라운드에서 320만 파운드의 투자를 유치했습니다. 옥스퍼드 대학교에서 수학 및 컴퓨터 과학 학사 학위를 취득했습니다.
Jessica Pointing: Jessica는 옥스퍼드 대학교에서 양자 컴퓨팅을 전공하는 물리학 박사 과정에 재학 중이며, 이전에는 Knight-Hennessy Scholar로 스탠퍼드 대학교 컴퓨터 과학과 박사 과정을 밟았습니다. MIT 학부생을 거쳐 하버드 대학교에서 John Harvard Scholar로 물리학 및 컴퓨터 과학 학사 학위를 우수한 성적으로 취득했습니다. Jessica는 Forbes 30 Under 30 과학 부문에 선정되었으며, 세계경제포럼(WEF) 양자 응용 글로벌 미래 위원회의 위원 펠로우로 선발되었습니다. TEDx 연사로 선정되었으며, IBM Think 컨퍼런스 및 Oracle Code One 컨퍼런스를 포함한 국제 기술 컨퍼런스에서 기조연설을 했습니다. NASA 에임스 연구센터 KBR에서 양자 연구원, Google에서 소프트웨어 엔지니어, McKinsey & Company에서 경영 컨설턴트, Goldman Sachs에서 투자 은행가, Morgan Stanley에서 전략가로 인턴십을 수행했습니다. Stanford Quantum Computing Association과 Harvard College Quantum Computing Association을 창립했으며, 팀과 함께 IBM 최초의 양자 컴퓨팅 해커톤에서 우승하여 IBM Q 양자 컴퓨팅 어워드를 수상했습니다. Creative Destruction Lab 양자 컴퓨팅 해커톤에서도 수상했습니다. 이더리움 해커톤인 ETHAmsterdam에 참가하여 팀이 그랜드 파이널리스트 상과 스폰서 상을 수상했습니다. McKinsey Women's Impact Award를 수상하고 Google Anita Borg Scholar로 선정되었습니다. Microsoft, Palantir, Adobe Research, Morgan Stanley, Goldman Sachs, Neo, Society of Women Engineers Scholar, Society of Geophysicists 등으로부터 장학금을 수상하기도 했습니다.
MetaMask Snaps를 처음 접한 것은 언제였으며, 어떤 경험이었나요?
ETHBogota에서 MetaMask Snaps를 처음 접했습니다. 가장 사용자 친화적인 방식으로 Blackbelt를 구현하기에 완벽한 기능이었습니다. 전반적으로 MetaMask Snaps는 사용하기 꽤 쉬워서 경험이 즐거웠습니다. MetaMask Snaps의 새로운 특성상 해커톤 중에 가끔 골치를 썩이는 사소한 문제들이 있었지만, 크게 심각한 수준은 아니었습니다.
MetaMask Snaps가 다른 지갑과 다른 점은 무엇인가요?
MetaMask Snaps는 지갑 확장 기능 개발을 오픈 소스화하고 다양한 요구를 가진 최종 사용자를 위한 다양하고 개별적인 솔루션을 가능하게 하는 훌륭한 방법입니다. 저희가 아는 한, MetaMask는 현재까지 커스텀 플러그인을 지원하는 유일한 지갑 제공업체입니다.
MetaMask로 Snaps를 개발하는 경험은 어떠했나요?
MetaMask Snaps로 개발하는 것은 꽤 쉬웠습니다. MetaMask Snaps의 작동 방식을 더 잘 이해하는 데 도움이 된 예제 프로젝트 중 하나로 시작한 후, 예제 코드를 기반으로 개발했습니다. MetaMask Snaps로 개발하는 것은 즐거웠지만, 특히 해커톤의 촉박한 마감 기한을 고려하면 가끔 발생하는 버그들이 정말 도전적이었습니다.
MetaMask Snaps는 여러분에게 어떤 의미인가요?
MetaMask Snaps는 지갑에 항상 있었으면 했던 기능입니다. 개발자에게는 혁신을 위한 다양한 기회를 열어줍니다.
MetaMask Snaps와 그것이 Web3 공간에 열어주는 가능성에서 어떤 기회를 보시나요?
MetaMask Snaps는 전체 Web3 생태계에서 더 높은 커스터마이징을 가능하게 하고, 사용자가 원하는 기능을 직접 선택할 수 있게 되어 전반적인 사용자 경험도 향상시킬 것입니다.
MetaMask Snaps를 시도해 보고 싶은 개발자들에게 조언이 있다면요?
MetaMask Snaps를 마음껏 탐색해 보세요. MetaMask Snaps의 작동 방식을 이해하고 그 위에 개발하기 위해 예제 프로젝트 중 하나로 시작하는 것이 가장 쉽습니다. 알 수 없는 문제가 발생하면 MetaMask Snaps git에 이슈를 게시하여 MetaMask Snaps 개발자들로부터 도움을 받을 수 있습니다.
MetaMask Snaps로 개발 시작하기
MetaMask Snaps를 시작하려면:
개발자 문서를 확인하세요
MetaMask Flask를 설치하세요
MetaMask Snaps 가이드를 참고하세요
Twitter, GitHub discussions, Discord에서 저희와 소통하세요
다음 해커톤에서 저희 팀을 만나보세요! 즐거운 BUIDLing ⚒️
면책 조항: MetaMask Snaps는 일반적으로 Consensys Software 이외의 제3자가 개발합니다. 제3자가 개발한 MetaMask Snaps의 사용은 전적으로 본인의 판단과 위험 부담 하에 이루어지며, 그러한 활동으로 인해 발생하는 손실이나 피해에 대한 책임은 전적으로 본인에게 있음에 동의합니다. Consensys는 제3자가 개발한 MetaMask Snaps에 대해 구두 또는 서면을 불문하고 어떠한 명시적 또는 묵시적 보증도 하지 않으며, 제3자가 개발한 MetaMask Snaps에 대한 모든 책임을 부인합니다. 블록체인 관련 소프트웨어 사용에는 위험이 따르며, MetaMask Snaps 사용 시 해당 위험을 전적으로 감수하게 됩니다.