Ana içeriğe geç

EIP-1271: Akıllı Sözleşme İmzalarını İmzalama ve Doğrulama

eip-1271
akıllı kontratlar
doğrulama
imzalama
Orta düzey
Nathan H. Leung
12 Ocak 2023
5 dakikalık okuma

EIP-1271 (opens in a new tab) standardı, akıllı sözleşmelerin imzaları doğrulamasına olanak tanır.

Bu öğreticide, dijital imzalara, EIP-1271'in arka planına ve Safe (opens in a new tab) (eski adıyla Gnosis Safe) tarafından kullanılan özel EIP-1271 uygulamasına genel bir bakış sunuyoruz. Kısaca bu, EIP-1271'i kendi sözleşmelerinizde uygulayabilmek için bir başlangıç noktası olarak hizmet edebilir.

İmza nedir?

Bu bağlamda imza (daha doğrusu “dijital imza”), bir mesaj ve onunla birlikte mesajın belirli bir kişiden/göndericiden/adresten geldiğine ilişkin bir tür kanıttır.

Örnek olarak, bir dijital imza şu şekilde görünebilir:

  1. Mesaj: "Bu siteye Ethereum cüzdanımla girmek istiyorum".
  2. İmzalayıcı: Adresim 0x000…
  3. Kanıt: İşte ben, 0x000…, bu mesajın tamamını gerçekten oluşturduğumun kanıtı (bu genellikle kriptografik bir şeydir).

Dijital imzanın hem "mesaj" hem de "imza" içerdiğini tekrar hatırlatmakta fayda var.

Neden? Mesela bana imzalamam için bir sözleşme verseniz ve ben de imzalama sayfasını yırtıp sözleşmenin geri kalanı olmadan size versem, sözleşmenin hiçbir geçerliliği olmaz.

Aynı nedenle, dijital imzalar da ilişkili bir mesaj olmadan bir hiçtir!

EIP-1271 neden var?

Ethereum tabanlı blokzincirlerde kullanılacak bir dijital imza oluşturmak için genelde kimsenin bilmediği gizli bir özel anahtara ihtiyacınız vardır. Bu, imzanızı sizin yapan şeydir (kimse gizli anahtarı bilmeden aynı imzayı yaratamaz).

Ethereum hesabınızın (yani harici olarak sahip olunan hesabınızın/EOA) ilişkili bir özel anahtarı vardır ve bu, bir web sitesi veya merkeziyetsiz uygulama sizden bir imza istediğinde (ör. “Ethereum ile Oturum Aç” için) genellikle kullanılan özel anahtardır.

Bir uygulama, ethers.js gibi bir üçüncü taraf kütüphanesi kullanarak oluşturduğunuz bir imzayı özel anahtarınızı bilmeden (opens in a new tab) doğrulayabilir (opens in a new tab) ve imzanın sizin tarafınızdan oluşturulduğundan emin olabilir.

Aslında, EOA dijital imzaları açık anahtar kriptografisi kullandığından, zincir dışı olarak oluşturulabilir ve doğrulanabilirler! Gazsız DAO oylaması bu şekilde çalışır — oyları zincir üstünde göndermek yerine, dijital imzalar kriptografik kütüphaneler kullanılarak zincir dışında oluşturulabilir ve doğrulanabilir.

EOA hesapları bir özel anahtara sahipken, akıllı sözleşme hesaplarının bu türde bir özel ya da gizli anahtarı yoktur (yani "Ethereum'la giriş yapın" ve benzerleri, akıllı sözleşme hesaplarınızla yerel biçimde çalışamaz).

EIP-1271'in çözmeyi hedeflediği problem: Eğer bir akıllı sözleşmenin imzanın içine yerleştirdiği bir "giz" yoksa akıllı sözleşmenin imzasının geçerli olduğunu nasıl anlarız?

EIP-1271 nasıl çalışır?

Akıllı sözleşmelerin mesaj imzalamak için kullanabilecekleri özel anahtarları yoktur. O zaman bir imzanın özgün olduğunu nasıl anlayabiliriz?

Bir fikir de, bir imzanın orijinal olup olmadığını doğrudan akıllı sözleşmeye sormaktır!

EIP'nin yaptığı şey, bir akıllı sözleşmeye belirli bir imzanın geçerli olup olmadığını sorma fikrini standart hale getirmektir.

EIP-1271'i uygulayan bir sözleşmenin, bir mesaj ve bir imza alan isValidSignature adında bir fonksiyonu olmalıdır. Sözleşme, sonrasında bir tür doğrulama mantığı yürütüp (burada spesifikasyon belirli bir şeyi uygulatmaz) ve imzanın geçerli olup olmadığını belirten bir değer döndürebilir.

Eğer isValidSignature geçerli bir sonuç döndürürse, bu, sözleşmenin “evet, bu imzayı + mesajı onaylıyorum!” dediği anlamına gelir.

Arayüz

İşte EIP-1271 spesifikasyonundaki arayüzün tam hali (aşağıda _hash parametresinden bahsedeceğiz, ancak şimdilik bunu doğrulanan mesaj olarak düşünebilirsiniz):

1pragma solidity ^0.5.0;
2
3contract ERC1271 {
4
5 // bytes4(keccak256("isValidSignature(bytes32,bytes)")
6 bytes4 constant internal MAGICVALUE = 0x1626ba7e;
7
8 /**
9 * @dev Sağlanan imzanın, sağlanan karma için geçerli olup olmadığını döndürmelidir
10 * @param _hash İmzalanacak verinin karması
11 * @param _signature _hash ile ilişkili imza bayt dizisi
12 *
13 * Fonksiyon başarılı olduğunda 0x1626ba7e sihirli bytes4 değerini döndürmelidir.
14 * Durumu değiştirmemelidir (solc < 0.5 için STATICCALL, solc > 0.5 için view değiştiricisi kullanılır)
15 * Harici çağrılara izin vermelidir
16 */
17 function isValidSignature(
18 bytes32 _hash,
19 bytes memory _signature)
20 public
21 view
22 returns (bytes4 magicValue);
23}
Tümünü göster

Örnek EIP-1271 Uygulaması: Safe

Sözleşmeler isValidSignature fonksiyonunu birçok farklı şekilde uygulayabilir — spesifikasyon tam olarak nasıl uygulanacağı hakkında pek bir şey söylemez.

EIP-1271'i uygulayan göze çarpan sözleşmelerden biri Safe'tir (önceden adı Gnosis Safe'ti).

Safe'in kodunda isValidSignature, imzaların iki şekilde (opens in a new tab) oluşturulup doğrulanabilmesi için şu şekilde uygulanmıştır (opens in a new tab):

  1. Zincir üstü mesajlar
    1. Oluşturma: bir Safe sahibi bir mesajı "imzalamak" için yeni bir Safe işlemi oluşturarak mesajı veri olarak işleme aktarır. Çoklu imza eşiğine ulaşabilmek için yeterli sayıda sahip işlemi imzaladığında, işlem yayımlanır ve çalıştırılır. İşlemde, mesajı “onaylanmış” mesajlar listesine ekleyen signMessage(bytes calldata _data) adında bir Safe fonksiyonu bulunur.
    2. Doğrulama: Safe sözleşmesinde isValidSignature fonksiyonunu çağırın ve mesaj parametresi olarak doğrulanacak mesajı ve imza parametresi için boş bir değeri (opens in a new tab) (yani 0x) geçin. Safe, imza parametresinin boş olduğunu görecek ve kriptografik olarak imzayı doğrulamak yerine, sadece devam etmesi ve mesajın "onaylanmış" mesajlar listesi içinde olup olmadığını kontrol etmesi gerektiğini bilecektir.
  2. Zincir dışı mesajlar:
    1. Oluşturma: Bir Safe sahibi zincir dışı bir mesaj oluşturur, ardından çoklu imza onay eşiğini aşmak için yeterli imza olana kadar diğer Safe sahiplerinin her birinin mesajı ayrı ayrı imzalamasını sağlar.
    2. Doğrulama: isValidSignature fonksiyonunu çağırın. Mesaj parametresinde, doğrulanması gereken mesajı aktarın. İmza parametresinde, Safe sahiplerinin her birinin bireysel imzalarını sıralanmış şekilde arka arkaya aktarın. Safe, eşiği karşılamak için yeterli imza olup olmadığını ve her imzanın geçerli olup olmadığını kontrol edecektir. Eğer geçerliyse, imza doğrulamasının başarılı olduğunu belirten bir değer döndürecektir.

_hash parametresi tam olarak nedir? Neden tüm mesajı aktarmıyoruz?

EIP-1271 arayüzündeki (opens in a new tab) isValidSignature fonksiyonunun mesajın kendisini değil, bunun yerine bir _hash parametresi aldığını fark etmiş olabilirsiniz. Bunun anlamı, isValidSignature'a değişken uzunluktaki mesajın tamamını geçmek yerine, mesajın 32 baytlık bir karmasını (genellikle keccak256) geçmemizdir.

calldatanın her baytı — yani, bir akıllı sözleşme fonksiyonuna geçirilen fonksiyon parametre verileri — 16 gaz maliyetindedir (sıfır bayt ise 4 gaz) (opens in a new tab), bu nedenle bir mesaj uzunsa çok fazla gaz tasarrufu sağlayabilir.

Önceki EIP-1271 Spesifikasyonları

Piyasada, isValidSignature fonksiyonunun ilk parametresinin message adında ve bytes türünde (sabit uzunluklu bytes32 yerine değişken uzunluklu) olduğu EIP-1271 spesifikasyonları bulunmaktadır. Bu, EIP-1271 standardının eski bir sürümüdür (opens in a new tab).

EIP-1271 benim sözleşmelerime nasıl uygulanmalıdır?

Burada spesifikasyon oldukça açık uçludur. Safe uygulamasının birkaç iyi fikri vardır:

  • Sözleşmenin "sahibinden" gelen EOA imzalarının geçerli olduğunu varsayabilirsiniz.
  • Onaylanmış mesajlardan oluşan bir listeyi kaydedip sadece onların geçerli olduğunu varsayabilirsiniz.

Sonuçta, bu sözleşme geliştiricisi olarak size kalmış!

Sonuç

EIP-1271 (opens in a new tab), akıllı sözleşmelerin imzaları doğrulamasına olanak tanıyan çok yönlü bir standarttır. Akıllı sözleşmelerin EOA'lar gibi hareket edebilmelerini sağlar; örnek olarak, "Ethereum'la giriş yapın" ifadesinin akıllı sözleşmelerle çalışabilmesine olanak tanır ve birçok farklı şekilde uygulanabilir (Safe'in anlaşılması zor ve ilginç uygulamasını da göz önünde bulundurarak).

Sayfanın son güncellenmesi: 16 Ocak 2026

Bu rehber yararlı oldu mu?