Trust Score Snap: İşlemleri kod renkleriyle basitleştirme

Bir ETHLisbon Hackathon kazananı

8 dk okuma
Trust Score Snap: İşlemleri kod renkleriyle basitleştirme

MetaMask Snaps, MetaMask'ı dünyanın en genişletilebilir cüzdanı haline getirme yol haritasıdır. Bir geliştirici olarak, özelliklerinizi ve API'larınızı tamamen yeni yollarla MetaMask'a entegre edebilirsiniz. Web3 geliştiricileri bu büyümenin özünü oluşturmaktadır ve bu seri, bugün inşa edilen yenilikçi MetaMask Snaps'leri tanıtmayı amaçlamaktadır.

Trust Score Snap

Snap Repo: https://github.com/Tbaut/template-snap-monorepo

Neden geliştirdiniz?

Ethereum'da işlem imzalama söz konusu olduğunda, görmezden gelinemeyen gerçek şudur: Kullanıcıların büyük çoğunluğunun ne imzaladıkları hakkında neredeyse hiçbir fikri yoktur. Yöntemleri ve argümanları çözümlemek iyi bir ilk adımdır; ancak kullanıcılar kötü amaçlı bir sözleşmeyle etkileşime girerse, görünen bilgiler yanıltıcı olabilir. Buna karşı bir denge oluşturmak için, kod renkleri 🟥 🟧 🟩 kullanarak nicel verileri çok basit bir şekilde göstermeyi düşündüm. Fikir, birden fazla kaynaktan kolayca doğrulanabilen verilere dayalı bir güven skoru göstermektir. 4 kriter ile başlamayı seçtim:

  • Akıllı sözleşmeyle genel olarak kaç kullanıcının etkileşime girdiği.

  • Mevcut hesabın bu sözleşmeyle ne sıklıkta etkileşime girdiği.

  • Bu sözleşmenin ne kadar eski olduğu.

  • Bu sözleşme kodunun doğrulanıp doğrulanmadığı.

Teknik uygulamayı bize anlatabilir misiniz?

Ana insights fonksiyonu

Snap oldukça basittir ve genişletmesi kolaydır. İşte üzerinden geçeceğimiz tam kod.

MetaMask'ta insights sekmesine tıklandığında onTransaction fonksiyonu çağrılır. İçinde, dikkate almaya karar verdiğimiz kriterleri bize sağlayan her fonksiyonu çağırırız.

type ScoreResult = {
  score: number;
  description: string;
};

const onTransaction: OnTransactionHandler = async ({
  transaction,
  chainId,
}) => {
  // call all the insights criteria
  // they all return a ScoreResult
}
Kopyala

Bu fonksiyonlar genellikle bir API çağırır ve sonuçları işler. Anlamak için bunlardan birine daha yakından bakalım.

Genel etkileşimlere dayalı güven skoru belirleme

Bir sözleşmenin aldığı toplam işlem miktarına göre skor veren fonksiyona daha yakından bakalım. Burada Etherscan API'sini kullanıyoruz, ancak aynı verileri doğrulamak için başka herhangi bir API de işe yarayabilir.

/**
 * Gets a trust score for a contract based on the overall tx count
 * 3 -> the contract had overall >=100 txs
 * 2 -> the contract had overall 50 <= tx < 99
 * 1 -> the contract had overall tx < 50
 *
 *@param options0
 * @param options0.chainId - the chain id to call the api with
 * @param options0.contractAddress - the contract address to check
 * @returns the score and a description
 */
export async function getContractTransactionCountScore({
  chainId,
  contractAddress,
}: IContractTransactionCountScore): Promise<ScoreResult> {
  // get the api url asking for the 100th transaction
  // it will return undefined if there is none
  const url100 = getEtherscanContractTxsUrl({
    txNumber: 100,
    chainId,
    contractAddress,
  });
  const { result: result100 } = await fetchUrl<EtherscanResponse>(url100);

  // if there is a 100th tx it means the contract
  // has received at least 100 txs. We have all we need
  // we can return with the best score of 3
  if (result100.length === 1) {
    return {
      score: 3,
      description: 'more than 100 txs',
    };
  }

  // this will be call if there are less than 100 txs
  // we check if there is a 50th tx.
  const url50 = getEtherscanContractTxsUrl({
    txNumber: 50,
    chainId,
    contractAddress,
  });
  const { result: result50 } = await fetchUrl<EtherscanResponse>(url50);

  // if there is a 50th tx we can return with a score of 2
  if (result50.length === 1) {
    return {
      score: 2,
      description: 'more than 50 txs',
    };
  }

  // otherwise, return with the lowest score
  return {
    score: 1,
    description: 'fewer than 50 txs',
  };
}
Kopyala

Tüm skorlar eşit değildir

Artık kriterlerimizin her biri için bir TrustResult'a sahip olduğumuza göre, ağırlık uygulamanın zamanı geldi. Gerçekten de, kriterlerimizin güven skorlarının hepsinin aynı ağırlığa sahip olması gerekmez. Örneğin, sözleşmeyle geçmişteki işlem miktarının bir maliyeti vardır. Bir dolandırıcı bunu manipüle etmek isteseydi, gas için bir miktar ETH harcaması gerekirdi. Sonuç olarak, bu kriter manipüle edilmesi daha maliyetli kabul edildiğinden daha önemlidir ve ona 3 ağırlık verdim.

Benzer şekilde, sözleşmenin yaşı bir saldırgan tarafından atlatılamaz; saldırgan yüksek bir güven skoru elde etmek isteseydi sözleşmeyi deploy etmek ve ardından saldırısını başlatmadan önce beklemek zorunda kalırdı. Buna 2 ağırlık verdim.

Diğer kriterler daha zayıf kabul edilir ve 1 ağırlığa sahiptir.

// arbitrary weight for each score
const Weights = {
  contractTransactionCountScore: 3,
  contractAgeScore: 2,
  contractVerificationScore: 1,
  contractUserTransactionScore: 1,
};

// calculate the overall trust score after applying the weights
const calculateOverallScoreWithWeight = ({
  contractTransactionCountScore,
  contractUserTransactionScore,
  contractAgeScore,
  contractVerificationScore,
}: CalculateOverallScoreWithWeightArgs) => {
  const totalWeitght = Object.values(Weights).reduce(
    (acc: number, curr: number) => acc + curr,
    0,
  );

  const overallScoreWithWeight =
    (contractUserTransactionScore.score * Weights.contractUserTransactionScore +
      contractTransactionCountScore.score *
        Weights.contractTransactionCountScore +
      contractAgeScore.score * Weights.contractAgeScore +
      contractVerificationScore.score * Weights.contractVerificationScore) /
    totalWeitght;

  return Math.floor(overallScoreWithWeight);
};
Kopyala

Nihai skoru sunma

Son olarak, artık bir akıllı sözleşmenin güven skoruna sahibiz ve bunu basit bir şekilde göstermemiz gerekiyor. MetaMask insights API'si yalnızca anahtar-değer çiftleri göstermeye izin vermektedir. Anahtarlar kalın yazıyla, değerler ise normal yazı ağırlığıyla gösterilir. Emoji kullanarak, kullanıcıları bunaltmayan ancak toplanan tüm bilgileri gösteren bir arayüz oluşturabileceğimi düşündüm.

Güven skorunu emojilere dönüştüren fonksiyon:

const getColor = (result: number) => {
  switch (result) {
    case 3:
      return '🟩';
    case 2:
      return '🟧';
    default:
      return '🟥';
  }
};
Kopyala

Ve onTransaction fonksiyonunun, anahtar-değer çiftlerini düzgün bir şekilde göstermek için bazı geçici çözümler içeren return kısmı:

return {
    insights: {
      '': `Trust score: ${getColor(overallScore)}`,
      ' ': '-----------------------------',
      'Contract popularity': `${getColor(
        contractTransactionCountScore.score,
      )} ${contractTransactionCountScore.description}`,
      'Previous interactions': `${getColor(
        contractUserTransactionScore.score,
      )} ${contractUserTransactionScore.description}`,
      'Contract age': `${getColor(contractAgeScore.score)} ${
        contractAgeScore.description
      }`,
      'Contract verification': `${getColor(contractVerificationScore.score)} ${
        contractVerificationScore.description
      }`,
    },
  };
Kopyala

Son olarak, 2 tür sözleşmeyi çağırmak için çok basit bir arayüz oluşturdum: biri çok iyi bilinen ve kullanılan bir Uniswap sözleşmesi, diğeri ise Remix'te varsayılan olarak sunulan çok yakın zamanda deploy edilmiş bir depolama sözleşmesi. Bu snap'i kullanarak Uniswap router sözleşmesiyle etkileşime girseydiniz şunu görürdünüz:

Bunu uygulasaydınız sonraki adımlar ne olurdu?

Bu, kullanıcılara güven verebilecek veya onları phishing saldırılarından koruyabilecek bilgilerin yalnızca yüzeyini çizmektedir. Açık olan ilk adım, verilerimiz için daha fazla kaynak kullanmak olacaktır. Sözleşme doğrulaması zaten Sourcify ve Etherscan kullanmaktadır, ancak her kriter için birden fazla kaynak kullanmak daha iyi olacaktır.

Ardından, dolandırıcıların skorları kolayca manipüle edememesi için daha gelişmiş algoritmalar uygulamalıyız. Örneğin, bir sözleşmeyle işlem yapan benzersiz hesap sayısını saymalıyız. Geçmişte onunla etkileşime giren hesaplar üzerinde de bazı analizler yapabiliriz; böylece hepsinin tek bir kaynaktan gelip gelmediğinden emin olabiliriz. Dezavantajı, tüm bu analizlerin birden fazla doğruluk kaynağı kullanılarak yapılmasının daha zor olmasıdır.

Entegre edilebilecek akıllı sözleşme dolandırıcılık tespiti üzerine yapılmış ilginç araştırmalar da mevcuttur. Daha fazla bilgi için.

Sonuç olarak, bu hack için aldığım ezici miktardaki olumlu tepkiler, kullanıcıların daha fazla bilgi talep ettiğini göstermektedir ve bunun kolay anlaşılır olmasının kilit bir rol oynadığına inanıyorum.

Kendinizden biraz bahseder misiniz?

ChainSafe'de yazılım mühendisiyim ve geçmişte Parity'de çalıştım. İyi UX'e odaklanarak ürünler geliştirmeyi seviyorum. Web3, benim için harika bir oyun alanıdır; çünkü her şey çok karmaşıktır ve bunu mümkün olduğunca fazla kişiye anlaşılır kılmaya çalışmak büyük bir meydan okumadır. Bu alanda neredeyse 5 yıldır bulunuyorum ve birçok hackathon'a katılmış olmama rağmen, genellikle hacker olmak yerine gönüllü, mentor veya jüri üyesi olarak yer alıyorum. Bunun temel nedeni, mükemmeliyetçi olmam ve genellikle hızlı ve özensiz çözümlerden hoşlanmamamdır :).

MetaMask Snaps ile ilk ne zaman tanıştınız ve deneyiminiz nasıldı?

İlginç bir şekilde, ChainSafe'deki meslektaşlarım ilk snap'lerden birini, Filecoin için olanı geliştirdi. Muhtemelen o zamanlar koda bir göz atmıştım, ancak daha fazla derinleşmemiştim.

Hackathon sırasında, insights API'si aslında geliştiricilere henüz açık değildi. Lizbon'da MetaMask ekibiyle konuşuyordum; MetaMask'a bir kullanıcı arayüzü ekleyebileceğimi beklemiyordum. Bana bunun yakında yayınlanacağını ve şimdi üzerine inşa edebileceğimi söylediler. Aslında bu yalnızca özel bir build ile mevcut olup dokümantasyon henüz yayınlanmamıştı.

MetaMask Snaps'i diğer cüzdanlardan farklı kılan nedir?

Bir sekmeye özel kod ekleme yeteneğine sahip olmak ve aynı zamanda bu kodun güvenli bir şekilde çalıştırılmasını sağlamak, çok geniş bir yelpazede geliştirmelerin önünü açmaktadır. Bundan ne çıkacağını merakla bekliyorum.

MetaMask ile Snaps geliştirmek sizin için nasıl bir deneyim?

Template monorepo, başlamayı son derece kolaylaştırdı. Tüm kodumu tek bir repoda yazabilmem, hem test dapp'ini hem de snap'i otomatik yenileme ile tek bir komutla başlatabilmem harika bir geliştirici deneyimiydi.

Snaps sizin için ne ifade ediyor?

Bir uzantının uzantısıdır. Hiçbir ürün tüm kullanıcılara uymaz. Bu birleştirilebilir katmanı eklemek, herhangi bir özellik talep eden herkesin onu kendisinin geliştirmesi için harika bir fırsattır.

MetaMask Snaps ile Web3 alanı için ne gibi fırsatlar görüyorsunuz?

Özellikle ihtiyaçlara bağlı olarak sonsuz özelleştirilebilirliğin kilidini açan insights hakkında konuşacağım. Gelecekte çok daha fazla güvenlik odaklı insights geliştirileceğine eminim.

MetaMask Snaps'i denemek isteyen geliştiricilere tavsiyeleriniz nelerdir?

Monorepo'yu klonlayın ve çok hızlı bir başlangıcın keyfini çıkarın.

MetaMask Snaps ile Geliştirme

MetaMask Snaps'e başlamak için:

  1. Geliştirici dokümanlarına göz atın

  2. MetaMask Flask'ı yükleyin

  3. Bir MetaMask Snaps rehberine göz atın

  4. Twitter, GitHub discussions ve Discord üzerinden bizimle bağlantıda kalın

Yakınınızdaki bir sonraki hackathon'da ekibimizi takip edin! Mutlu BUIDLing ⚒️

Sorumluluk Reddi: MetaMask Snaps genellikle Consensys Software dışındaki üçüncü taraflarca geliştirilmektedir. Üçüncü taraflarca geliştirilen MetaMask Snaps'lerin kullanımı tamamen kendi takdirinize ve riskinize bağlıdır; bu tür faaliyetlerden kaynaklanan herhangi bir kayıp veya zarardan yalnızca siz sorumlu olacaksınız. Consensys, üçüncü taraflarca geliştirilen MetaMask Snaps için sözlü veya yazılı, açık veya zımni hiçbir garanti vermez ve üçüncü taraflarca geliştirilen Snaps için tüm sorumluluğu reddeder. Blockchain ile ilgili yazılımların kullanımı riskler barındırır ve MetaMask Snaps kullanırken bu riskleri tamamen üstlenmiş olursunuz.

Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.

Çeviriyi değerlendir
  • MetaMask
    MetaMask

    Consensys tarafından geliştirilen, öncü kendi saklama yetkili kripto cüzdanı ve kriptoya açılan kapı.

    Tüm makaleleri oku