Ana içeriğe atla
Change page

Akıllı sözleşmelerin anatomisi

Bir akıllı sözleşme, Ethereum üzerindeki bir adreste çalışan bir programdır. Bir işlem alındığında yürütülebilen veriler ve işlevlerden oluşurlar. İşte bir akıllı sözleşmeyi nelerin oluşturduğuna dair bir genel bakış.

Ön koşullar

Önce akıllı sözleşmeler hakkında okuduğunuzdan emin olun. Bu belge, JavaScript veya Python gibi programlama dillerine zaten aşina olduğunuzu varsayar.

Veriler

Herhangi bir sözleşme verisi bir konuma atanmalıdır: storage veya memory. Bir akıllı sözleşmede depolamayı değiştirmek maliyetlidir, bu nedenle verilerinizin nerede yaşaması gerektiğini düşünmeniz gerekir.

Depolama

Kalıcı veriler depolama olarak adlandırılır ve durum değişkenleri ile temsil edilir. Bu değerler Blokzincir üzerinde kalıcı olarak depolanır. Sözleşmenin derlendiğinde Blokzincir üzerinde ne kadar depolamaya ihtiyacı olduğunu takip edebilmesi için türü bildirmeniz gerekir.

// Solidity örneği
contract SimpleStorage {
    uint storedData; // Durum değişkeni
    // ...
}
# Vyper örneği
storedData: int128

Nesne yönelimli dillerde zaten programlama yaptıysanız, muhtemelen çoğu türe aşinasınızdır. Ancak, Ethereum geliştirmeye yeniyseniz address sizin için yeni olmalıdır.

Bir address türü, 20 bayt veya 160 bite eşit olan bir Ethereum adresi tutabilir. Başında 0x bulunan onaltılık (hexadecimal) gösterimde döner.

Diğer türler şunları içerir:

  • boolean (mantıksal)
  • tam sayı (integer)
  • sabit noktalı sayılar
  • sabit boyutlu bayt dizileri
  • dinamik boyutlu bayt dizileri
  • rasyonel ve tam sayı sabitleri (literals)
  • dize (string) sabitleri
  • onaltılık (hexadecimal) sabitler
  • enum'lar (numaralandırmalar)

Daha fazla açıklama için belgelere göz atın:

Bellek

Yalnızca bir sözleşme işlevinin yürütülme ömrü boyunca depolanan değerlere bellek değişkenleri denir. Bunlar Blokzincir üzerinde kalıcı olarak depolanmadığından, kullanımları çok daha ucuzdur.

Ethereum Sanal Makinesi (EVM)'nin verileri nasıl depoladığı (Depolama, Bellek ve Yığın) hakkında daha fazla bilgiyi Solidity belgelerinde (opens in a new tab) öğrenebilirsiniz.

Ortam değişkenleri

Sözleşmenizde tanımladığınız değişkenlere ek olarak, bazı özel küresel değişkenler vardır. Bunlar öncelikle Blokzincir veya mevcut işlem hakkında bilgi sağlamak için kullanılır.

Örnekler:

ÖzellikDurum değişkeniAçıklama
block.timestampuint256Mevcut blok dönem zaman damgası
msg.senderaddressMesajın göndericisi (mevcut çağrı)

İşlevler

En basit ifadeyle işlevler, gelen işlemlere yanıt olarak bilgi alabilir veya bilgi ayarlayabilir.

İki tür işlev çağrısı vardır:

  • internal – bunlar bir EVM çağrısı oluşturmaz
    • Dahili işlevlere ve durum değişkenlerine yalnızca dahili olarak (yani, mevcut sözleşmenin içinden veya ondan türetilen sözleşmelerden) erişilebilir
  • external – bunlar bir EVM çağrısı oluşturur
    • Harici işlevler sözleşme arayüzünün bir parçasıdır, bu da diğer sözleşmelerden ve işlemler aracılığıyla çağrılabilecekleri anlamına gelir. Harici bir f işlevi dahili olarak çağrılamaz (yani, f() çalışmaz, ancak this.f() çalışır).

Ayrıca public veya private olabilirler

  • public işlevleri sözleşme içinden dahili olarak veya mesajlar aracılığıyla harici olarak çağrılabilir
  • private işlevleri yalnızca tanımlandıkları sözleşme için görünürdür ve türetilmiş sözleşmelerde görünmez

Hem işlevler hem de durum değişkenleri genel (public) veya özel (private) yapılabilir

İşte bir sözleşmedeki bir durum değişkenini güncellemek için bir işlev:

// Solidity örneği
function update_name(string value) public {
    dapp_name = value;
}
  • string türündeki value parametresi işleve geçirilir: update_name
  • public olarak bildirilmiştir, yani herkes erişebilir
  • view olarak bildirilmemiştir, bu nedenle sözleşme durumunu değiştirebilir

View (Görüntüleme) işlevleri

Bu işlevler, sözleşme verilerinin durumunu değiştirmemeyi taahhüt eder. Yaygın örnekler "getter" (alıcı) işlevleridir – örneğin bunu bir kullanıcının bakiyesini almak için kullanabilirsiniz.

// Solidity örneği
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Durumu değiştirmek olarak kabul edilenler:

  1. Durum değişkenlerine yazmak.
  2. Olaylar yaymak (opens in a new tab).
  3. Başka sözleşmeler oluşturmak (opens in a new tab).
  4. selfdestruct kullanmak.
  5. Çağrılar aracılığıyla Ether göndermek.
  6. view veya pure olarak işaretlenmemiş herhangi bir işlevi çağırmak.
  7. Düşük seviyeli çağrılar kullanmak.
  8. Belirli işlem kodlarını (opcodes) içeren satır içi (inline) assembly kullanmak.

Kurucu işlevler

constructor işlevleri, sözleşme ilk dağıtıldığında yalnızca bir kez yürütülür. Sınıf tabanlı birçok programlama dilindeki constructor gibi, bu işlevler genellikle durum değişkenlerini belirtilen değerlerine başlatır.

# Vyper örneği

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Yerleşik işlevler

Sözleşmenizde tanımladığınız değişkenlere ve işlevlere ek olarak, bazı özel yerleşik işlevler vardır. En belirgin örnek şudur:

  • address.send() – Solidity
  • send(address) – Vyper

Bunlar, sözleşmelerin diğer hesaplara ETH göndermesine olanak tanır.

İşlevler yazmak

İşlevinizin şunlara ihtiyacı vardır:

  • parametre değişkeni ve türü (parametre kabul ediyorsa)
  • internal/external (dahili/harici) bildirimi
  • pure/view/payable bildirimi
  • dönüş türü (bir değer döndürüyorsa)

Tam bir sözleşme buna benzer bir şey olabilir. Burada constructor işlevi, dapp_name değişkeni için bir başlangıç değeri sağlar.

Olaylar ve günlükler

Olaylar, akıllı sözleşmenizin ön yüzünüzle veya abone olan diğer uygulamalarla iletişim kurmasını sağlar. Bir işlem doğrulanıp bir bloğa eklendiğinde, akıllı sözleşmeler olaylar yayabilir ve bilgileri günlüğe kaydedebilir; ön yüz daha sonra bunları işleyebilir ve kullanabilir.

Açıklamalı örnekler

Bunlar Solidity ile yazılmış bazı örneklerdir. Kodla oynamak isterseniz, onlarla Remix (opens in a new tab) üzerinde etkileşime girebilirsiniz.

Merhaba dünya

Token

Benzersiz dijital varlık

Daha fazla okuma

Akıllı sözleşmelere dair daha eksiksiz bir genel bakış için Solidity ve Vyper belgelerine göz atın: