Blackbelt Snap:リアルタイムで詐欺から身を守る

ETHBogota ハッカソン Snap

読了時間:9分
Blackbelt Snap:リアルタイムで詐欺から身を守る

MetaMask Snapsは、MetaMaskを世界で最も拡張性の高いウォレットにするためのロードマップです。開発者として、まったく新しい方法でMetaMaskに機能やAPIを追加することができます。Web3開発者はこの成長の中核を担っており、このシリーズでは現在開発中の革新的なMetaMask Snapsを紹介することを目的としています。

Blackbelt Snap

Snap リポジトリ: https://github.com/s-a-malik/blackbelt

なぜ開発したのですか?

ブロックチェーン上でのインタラクションをエンドユーザーにとってより安全にしたいと考えました。特に、詐欺やエクスプロイトの被害を恐れている、新規ユーザーや技術に不慣れなユーザーを念頭に置いています。そこで、スマートコントラクトのインタラクションに対してリアルタイムのリスク評価を提供する方法を考案しました。

技術的な実装について説明していただけますか?

技術的な構成

Blackbeltは、サーバー、MetaMask Snap、そしてウェブサイトのフロントエンドという3つの要素で構成されています。サーバーはデータを取得し、スマートコントラクトのリスクスコアを計算します。MetaMask Snapおよびウェブサイトはサーバーを呼び出し、HTTPSリクエスト内で特定のコントラクトアドレスを提供します。プロジェクトの完全な実装はこちらでご確認いただけます。

サーバー

サーバーはFlaskバックエンドで構成されており、セキュリティスコアとメタデータをJSONとして返します。/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)

    #Check if chached results should be provided
    is_snaps = True if is_snaps == "true" else False
    if is_snaps and contract_address in contract_to_score:
        #Retrieve from cache and return
        return contract_to_score[contract_address][0]
    else:
        chain = "mainnet" if chain_id == 1 else "goerli"

        #Calculate new security score
        output = compute_security_score(contract_address, chain)
        if output["status"] != "ok":
            return output

        #Add to the server cache
        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で検証済みかつ監査済みとして宣言されているかどうか、またコントラクトの経過時間を確認します。

# in the compute_security_score function:
# ...
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には、トランザクションが発生するたびにトリガーされるtransaction insights APIを使用しています。Snapは4つのステップで構成されています。まず、トランザクション構造体からトランザクションの主要な詳細情報を取得します。次に、トランザクションの詳細をサーバーに送信し、セキュリティスコアとメタデータを取得します。第三に、リクエストのステータスを確認し、エラーを処理します。第四に、セキュリティスコアとメタデータをMetaMask Snaps内のJSONオブジェクトとして返します。


export const onTransaction: OnTransactionHandler = async ({
  transaction,
  chainId,
}) => {

  // Get tx data
  const user_address = transaction.from;
  const contract_address =  transaction.to;
  const chain_id =  chainId.split(":")[1];

  // Call api for risk assessment
  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();

  // Cases for returning insights
  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に追加する前に機能を素早くテストするために使用されます。ユーザーはコントラクトアドレスを入力して「Rate now」を押すことで機能を試すことができます。アプリケーションが気に入った場合は、右上の「Add MetaMask Snap」をクリックしてMetaMaskに追加できます。

実装する場合の次のステップは何ですか?

次のステップは、リスクのあるコントラクトをより確実に検出できるよう、バックエンドと分析機能を改善することです。現在の評価はDAU数やトランザクション数(多いほど良い)などのヒューリスティックに基づいていますが、リスクスコアをより正確に計算するために機械学習などのより高度な手法を取り入れたいと考えています。分析機能の改善後は、キャッシュや高速なデータ取得手順を通じて、リスク評価プロセス全体を高速化し、ユーザーエクスペリエンスをできる限りシームレスにすることに注力します。

あなたとチームについて少し教えていただけますか?

私たちは、オックスフォード大学の博士課程学生3名とオックスフォード大学卒業生1名で構成されるチームです。Oxford Blockchain Societyに所属しており、ETHBogotaハッカソンで出会い、チームを結成しました。

Lucas Schneider: Lucasはオックスフォード大学のコンピュータサイエンス専攻のDPhil候補生で、CRISPRシステムにおける遺伝子編集の結果を予測するための計算・機械学習モデルを研究しています。DPhil開始前は、ロンドンのバークレイズ投資銀行の証券化商品ストラクチャリンググループにアナリストとして勤務し、複数のエキゾチックな仕組みクレジット取引や不良債権・商業用不動産ポートフォリオのファイナンスに携わりました。ロンドン・スクール・オブ・エコノミクス・アンド・ポリティカル・サイエンスで金融学の修士号を取得し、フリードリヒ・アレクサンダー大学エアランゲン=ニュルンベルクで定量的手法に重点を置いた経済学の学士号を取得しています。

Shreshth Malik: Shreshthはオックスフォード大学の機械学習専攻のDPhil候補生で、より信頼性の高い実世界への応用を実現するために、深層学習手法をより堅牢で信頼できるものにすることを研究しています。また、複数のAIスタートアップやロンドンを拠点とするシードステージのVCファンドでも勤務経験があります。機械学習(UCL)および物理自然科学(ケンブリッジ大学)の修士号を取得しています。

Paweł Narkiewicz: Pawełはシリアルアントレプレナー、科学者、そしてテクノロジーフリークです。18歳のとき、スタンフォードとハーバードの優秀な数学者たちとともに数論に関する最初の研究論文を発表しました。翌年、ポーランドにおける技術スキル開発を加速するための成功したEdTechスタートアップを設立し、3ヶ月で自己資金調達型のビジネスとなりました。同時に、MedTechスタートアップに経営株主兼MLエンジニアとして参画し、スタートアップの中核技術の一つの開発をリードしました。オックスフォード、スタンフォード、ハーバードの優秀な研究者たちと直接協力し、そのスタートアップはプレシードラウンドで77万ドル、シードラウンドで320万ポンドの資金調達に成功しました。オックスフォード大学で数学とコンピュータサイエンスの学士号を取得しています。

Jessica Pointing: Jessicaはオックスフォード大学で量子コンピューティングを専門とする物理学の博士課程に在籍しており、以前はKnight-Hennessy Scholarとしてスタンフォードのコンピュータサイエンス博士課程に在籍していました。MITで学士課程を経た後、ハーバード大学でJohn Harvard Scholarとして物理学とコンピュータサイエンスの学士号を優秀な成績で取得しました。Jessicaはフォーブス「30 Under 30」(科学部門)に選出され、世界経済フォーラムの「Global Future Council on Quantum Applications」のカウンシルフェローにも選ばれました。TEDxスピーカーに選出され、IBMのThinkカンファレンスやOracle Code Oneカンファレンスなど、国際的なテックカンファレンスで基調講演を行っています。NASAエイムズ研究センターのKBRで量子研究者、Googleでソフトウェアエンジニア、McKinsey and Companyで経営コンサルタント、Goldman Sachsで投資銀行家、Morgan Stanleyでストラテジストとしてインターンを経験しました。スタンフォード量子コンピューティング協会とハーバード大学量子コンピューティング協会を設立し、チームとともに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、Society of Geophysicistsからも奨学金を受賞しています。

MetaMask Snapsを最初に知ったのはいつで、どのような体験でしたか?

MetaMask SnapsはETHBogotaで初めて知りました。Blackbeltを最もユーザーフレンドリーな形で実現するための完璧な機能でした。全体的に、MetaMask Snapsは比較的使いやすく、体験は良好でした。MetaMask Snapsの新しさゆえに、ハッカソン中に頭を悩ませる小さな問題が時折発生しましたが、大きな問題ではありませんでした。

MetaMask Snapsが他のウォレットと異なる点は何ですか?

MetaMask Snapsは、ウォレット拡張機能の開発をオープンソース化し、異なるニーズを持つエンドユーザーに多様で個別のソリューションを提供するための優れた方法です。私たちの知る限り、カスタムプラグインをサポートしているウォレットプロバイダーは現時点ではMetaMaskだけです。

MetaMask SnapsでのSnapの開発はどのような体験でしたか?

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にissueを投稿すれば、MetaMask Snapsの開発者からサポートを受けることができます。

MetaMask Snapsで開発を始めよう

MetaMask Snapsを始めるには:

  1. 開発者ドキュメントをご確認ください

  2. MetaMask Flaskをインストールしてください

  3. MetaMask Snapsガイドをご覧ください

  4. TwitterGitHubディスカッションDiscordで私たちとつながり続けてください

次のハッカソンでお近くの会場でお会いしましょう!Happy BUIDLing ⚒️

免責事項:MetaMask Snapsは一般的にConsensys Software以外のサードパーティによって開発されています。サードパーティが開発したMetaMask Snapsの使用は、ご自身の判断とリスクのもとで行われ、そのような活動から生じる損失や損害についてはお客様が単独で責任を負うことに同意したものとみなされます。Consensysはサードパーティが開発したMetaMask Snapsについて、口頭または書面による明示的または黙示的な保証を一切行わず、サードパーティが開発したMetaMask Snapsに関するすべての責任を否認します。ブロックチェーン関連ソフトウェアの使用にはリスクが伴い、MetaMask Snapsを使用する際にはそのリスクをすべて自己負担するものとします。

AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。

翻訳を評価する
  • MetaMask
    MetaMask

    ConsenSysが構築した、Web3への入口となる主要なセルフカストディ型暗号資産ウォレット。

    すべての記事を読む