Ana içeriğe geç

Sarı Kağıdın EVM Spesifikasyonlarını Anlama

evm
Orta düzey
qbzzt
15 Mayıs 2022
15 dakikalık okuma

Sarı Kağıtopens in a new tab, Ethereum'un resmi spesifikasyonudur. EIP süreci tarafından değiştirilen yerler dışında, her şeyin tam olarak nasıl çalıştığının açıklamasını içerir. Programcıların aşina olmayabileceği bir terminoloji içeren matematiksel bir makale olarak yazılmıştır. Bu makalede, onu ve dolayısıyla ilgili diğer matematiksel makaleleri nasıl okuyacağınızı öğreneceksiniz.

Hangi Sarı Kağıt?

Ethereum'daki hemen hemen her şey gibi Sarı Kağıt da zamanla gelişir. Belirli bir sürüme atıfta bulunabilmek için, bu yazının yazıldığı andaki güncel sürümü yükledim. Kullandığım bölüm, sayfa ve denklem numaraları o sürüme atıfta bulunacaktır. Bu belgeyi okurken başka bir pencerede açık tutmak iyi bir fikirdir.

Neden EVM?

Orijinal sarı kağıt, Ethereum'un geliştirilmesinin en başında yazılmıştır. Ağı güvence altına almak için başlangıçta kullanılan, iş ispatı tabanlı orijinal mutabakat mekanizmasını açıklamaktadır. Ancak Ethereum, Eylül 2022'de iş ispatını bırakarak hisse ispatı tabanlı mutabakat kullanmaya başladı. Bu öğretici, sarı kağıdın Ethereum Sanal Makinesi'ni tanımlayan kısımlarına odaklanacaktır. EVM, hisse ispatına geçişten etkilenmemiştir (DIFFICULTY işlem kodunun geri dönüş değeri hariç).

9 Yürütme modeli

Bu bölüm (s. 12-14), EVM tanımının çoğunu içerir.

Sistem durumu terimi, sistemi çalıştırmak için sistem hakkında bilmeniz gereken her şeyi içerir. Tipik bir bilgisayarda bu, bellek, yazmaçların içeriği vb. anlamına gelir.

Turing makinesiopens in a new tab bir hesaplama modelidir. Esasen bu, bir bilgisayarın basitleştirilmiş bir sürümüdür ve normal bir bilgisayarın yapabildiği hesaplamaları yapma yeteneğine sahip olduğu kanıtlanmıştır (bir bilgisayarın hesaplayabildiği her şeyi bir Turing makinesi de hesaplayabilir ve bunun tersi de geçerlidir). Bu model, neyin hesaplanabilir olup neyin olmadığına dair çeşitli teoremleri kanıtlamayı kolaylaştırır.

Turing-tamopens in a new tab terimi, bir Turing makinesi ile aynı hesaplamaları yapabilen bir bilgisayar anlamına gelir. Turing makineleri sonsuz döngülere girebilir, ancak EVM gazı biteceği için giremez, bu yüzden sadece yarı-Turing-tamdır.

9.1 Temel Bilgiler

Bu bölüm, EVM'nin temellerini ve diğer hesaplama modelleriyle nasıl karşılaştırıldığını açıklar.

Yığın makinesiopens in a new tab, ara verileri yazmaçlarda değil, bir yığındaopens in a new tab depolayan bir bilgisayardır. Uygulaması kolay olduğu için bu, sanal makineler için tercih edilen mimaridir, bu da hataların ve güvenlik açıklarının çok daha az olası olduğu anlamına gelir. Yığındaki bellek 256 bitlik kelimelere bölünür. Bu, Ethereum'un Keccak-256 ile özetleme ve eliptik eğri hesaplamaları gibi temel kriptografik işlemleri için uygun olduğu için seçilmiştir. Yığının maksimum boyutu 1024 öğedir (1024 x 256 bit). İşlem kodları yürütüldüğünde, parametrelerini genellikle yığından alırlar. Yığındaki öğeleri yeniden düzenlemek için özel olarak POP (yığının en üstündeki öğeyi kaldırır), DUP_N (yığındaki N'inci öğeyi çoğaltır) vb. gibi işlem kodları vardır.

EVM'nin ayrıca, yürütme sırasında veri depolamak için kullanılan bellek adında geçici bir alanı vardır. Bu bellek, 32 baytlık kelimeler halinde düzenlenmiştir. Tüm bellek konumları sıfıra başlatılır. Belleğe bir kelime eklemek için bu Yulopens in a new tab kodunu yürütürseniz, kelimedeki boş alanı sıfırlarla doldurarak 32 baytlık belleği doldurur, yani 0-29 konumlarında sıfırlar, 30. konumda 0x60 ve 31. konumda 0xA7 olan bir kelime oluşturur.

1mstore(0, 0x60A7)

mstore, EVM'nin bellekle etkileşim için sağladığı üç işlem kodundan biridir - belleğe bir kelime yükler. Diğer ikisi, belleğe tek bir bayt yükleyen mstore8 ve bellekten yığına bir kelime taşıyan mload'dur.

EVM'nin ayrıca sistem durumunun bir parçası olarak tutulan ayrı, kalıcı bir depolama modeli vardır - bu bellek (yığındaki kelime adresli bayt dizilerinin aksine) kelime dizileri halinde düzenlenmiştir. Bu depolama, sözleşmelerin kalıcı verilerini tuttuğu yerdir - bir sözleşme yalnızca kendi depolamasıyla etkileşime girebilir. Depolama, anahtar-değer eşlemeleri şeklinde düzenlenir.

Sarı Kağıt'ın bu bölümünde bahsedilmese de, dördüncü bir bellek türünün olduğunu bilmek de faydalıdır. Çağrı verileri, bir işlemin veri parametresiyle aktarılan değeri depolamak için kullanılan bayt adresli, salt okunur bir bellektir. EVM'nin calldata yönetimi için özel işlem kodları vardır. calldatasize, verilerin boyutunu döndürür. calldataload veriyi yığına yükler. calldatacopy veriyi belleğe kopyalar.

Standart Von Neumann mimarisiopens in a new tab, kodu ve veriyi aynı bellekte saklar. EVM, güvenlik nedenleriyle bu standardı izlemez - geçici belleği paylaşmak program kodunu değiştirmeyi mümkün kılar. Bunun yerine kod, depolamaya kaydedilir.

Kodun bellekten yürütüldüğü sadece iki durum vardır:

  • Bir sözleşme, başka bir sözleşme oluşturduğunda (CREATEopens in a new tab veya CREATE2opens in a new tab kullanarak), sözleşme oluşturucunun kodu bellekten gelir.
  • Herhangi bir sözleşmenin oluşturulması sırasında, kurucu kod çalışır ve ardından asıl sözleşmenin kodunu (yine bellekten) döndürür.

İstisnai yürütme terimi, mevcut sözleşmenin yürütülmesinin durmasına neden olan bir istisna anlamına gelir.

9.2 Ücretlere genel bakış

Bu bölüm, gaz ücretlerinin nasıl hesaplandığını açıklar. Üç maliyet vardır:

İşlem kodu maliyeti

Belirli işlem kodunun doğal maliyeti. Bu değeri elde etmek için Ek H'deki (s. 28, denklem (327) altında) işlem kodunun maliyet grubunu ve denklem (324)'teki maliyet grubunu bulun. Bu size bir maliyet fonksiyonu verir, bu da çoğu durumda Ek G'deki (s. 27) parametreleri kullanır.

Örneğin, CALLDATACOPYopens in a new tab işlem kodu, Wcopy grubunun bir üyesidir. Bu grubun işlem kodu maliyeti Gverylow+Gcopy×⌈μs[2]÷32⌉ şeklindedir. Ek G'ye baktığımızda, her iki sabitin de 3 olduğunu görürüz, bu da bize 3+3×⌈μs[2]÷32⌉ sonucunu verir.

⌈μs[2]÷32⌉ ifadesini hâlâ çözmemiz gerekiyor. En dıştaki kısım olan ⌈ <değer> ⌉, tavan fonksiyonudur; bu fonksiyon, verilen bir değer için o değerden küçük olmayan en küçük tam sayıyı döndürür. Örneğin, ⌈2.5⌉ = ⌈3⌉ = 3. İç kısım μs[2]÷32'dir. 3. sayfadaki 3. bölüme (Kurallar) bakıldığında, μ makine durumudur. Makine durumu, 13. sayfadaki 9.4.1 bölümünde tanımlanmıştır. O bölüme göre, makine durumu parametrelerinden biri yığın için olan s'dir. Hepsini bir araya getirdiğimizde, μs[2] yığındaki 2 numaralı konum gibi görünüyor. İşlem kodunaopens in a new tab bakıldığında, yığındaki 2 numaralı konum, verinin bayt cinsinden boyutudur. Wcopy grubundaki diğer işlem kodlarına, yani CODECOPYopens in a new tab ve RETURNDATACOPYopens in a new tab kodlarına bakıldığında, onların da aynı konumda bir veri boyutuna sahip olduğu görülür. Yani ⌈μs[2]÷32⌉, kopyalanan veriyi depolamak için gereken 32 baytlık kelimelerin sayısıdır. Hepsini bir araya getirdiğimizde, CALLDATACOPYopens in a new tab işleminin doğal maliyeti 3 gaz artı kopyalanan her veri kelimesi başına 3 gazdır.

Çalıştırma maliyeti

Çağırdığımız kodu çalıştırmanın maliyeti.

Bellek genişletme maliyeti

Bellek genişletme maliyeti (gerekirse).

Denklem 324'te bu değer Cmemi')-Cmemi) olarak yazılır. 9.4.1 bölümüne tekrar baktığımızda μi'nin bellekteki kelime sayısı olduğunu görürüz. Yani μi işlem kodundan önceki bellekteki kelime sayısıdır ve μi' işlem kodundan sonraki bellekteki kelime sayısıdır.

Cmem fonksiyonu denklem 326'da şu şekilde tanımlanır: Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋. ⌊x⌋ taban fonksiyonudur; bu fonksiyon, verilen bir değer için o değerden büyük olmayan en büyük tam sayıyı döndürür. Örneğin, ⌊2.5⌋ = ⌊2⌋ = 2. a < √512 olduğunda, a2 < 512 olur ve taban fonksiyonunun sonucu sıfırdır. Yani ilk 22 kelime (704 bayt) için maliyet, gereken bellek kelimesi sayısıyla doğrusal olarak artar. Bu noktanın ötesinde ⌊a2 ÷ 512⌋ pozitiftir. Gereken bellek yeterince yüksek olduğunda, gaz maliyeti bellek miktarının karesiyle orantılıdır.

Not: Bu faktörler yalnızca doğal gaz maliyetini etkiler. Bir son kullanıcının ne kadar ödemesi gerektiğini belirleyen ücret piyasasını veya doğrulayıcılara verilen ipuçlarını hesaba katmaz. Bu sadece EVM'de belirli bir işlemi çalıştırmanın ham maliyetidir.

Gaz hakkında daha fazlasını okuyun.

9.3 Yürütme ortamı

Yürütme ortamı, blokzincir durumunun veya EVM'nin bir parçası olmayan bilgileri içeren bir demet olan I'dır.

ParametreVeriye erişim için işlem koduVeriye erişim için Solidity kodu
IaADDRESSopens in a new tabaddress(this)
IoORIGINopens in a new tabtx.origin
IpGASPRICEopens in a new tabtx.gasprice
IdCALLDATALOADopens in a new tab vb.msg.data
IsCALLERopens in a new tabmsg.sender
IvCALLVALUEopens in a new tabmsg.value
IbCODECOPYopens in a new tabaddress(this).code
IHBlok başlığı alanları, NUMBERopens in a new tab ve DIFFICULTYopens in a new tab gibiblock.number, block.difficulty, vb.
IeSözleşmeler arasındaki çağrılar için çağrı yığınının derinliği (sözleşme oluşturma dahil)
IwEVM'nin durumu değiştirmesine izin veriliyor mu yoksa statik olarak mı çalışıyor
  1. bölümün geri kalanını anlamak için birkaç parametre daha gereklidir:
ParametreTanımlandığı bölümAnlamı
σ2 (s. 2, denklem 1)Blokzincir durumu
g9.3 (s. 13)Kalan gaz
A6.1 (s. 8)Birikmiş alt durum (işlem bittiğinde gerçekleşmesi planlanan değişiklikler)
o9.3 (s. 13)Çıktı - dahili işlem (bir sözleşmenin diğerini çağırdığı durum) ve görüntüleme işlevlerine (yalnızca bilgi istediğiniz, dolayısıyla bir işlemi beklemenize gerek olmayan durum) yapılan çağrılar durumunda döndürülen sonuçtur

9.4 Yürütmeye genel bakış

Tüm ön bilgileri edindiğimize göre, nihayet EVM'nin nasıl çalıştığını incelemeye başlayabiliriz.

137-142 arası denklemler bize EVM'yi çalıştırmak için başlangıç koşullarını verir:

SembolBaşlangıç değeriAnlamı
μggKalan gaz
μpc0Program sayacı, yürütülecek bir sonraki komutun adresi
μm(0, 0, ...)Bellek, tamamı sıfır olarak başlatılır
μi0Kullanılan en yüksek bellek konumu
μs()Yığın, başlangıçta boştur
μoÇıktı, geri dönüş verisiyle (RETURNopens in a new tab veya REVERTopens in a new tab) veya verisiz (STOPopens in a new tab veya SELFDESTRUCTopens in a new tab) durana kadar boş kümedir.

Denklem 143, yürütme sırasında her zaman noktasında dört olası koşul olduğunu ve bunlarla ne yapılacağını söyler:

  1. Z(σ,μ,A,I). Z, bir işlemin geçersiz bir durum geçişi oluşturup oluşturmadığını test eden bir işlevi temsil eder (bkz. istisnai durdurma). Doğru olarak değerlendirilirse, değişiklikler uygulanmadığı için yeni durum (gaz yakılması hariç) eski durumla aynıdır.
  2. Yürütülen işlem kodu REVERTopens in a new tab ise, yeni durum eski durumla aynıdır, bir miktar gaz kaybolur.
  3. İşlem dizisi bir RETURNopens in a new tab) ile belirtildiği gibi biterse, durum yeni duruma güncellenir.
  4. 1-3 bitiş koşullarından birinde değilsek, çalıştırmaya devam edin.

9.4.1 Makine Durumu

Bu bölüm makine durumunu daha ayrıntılı olarak açıklamaktadır. w'nin geçerli işlem kodu olduğunu belirtir. μpc, kodun uzunluğu olan ||Ib||'den küçükse, o bayt (Ibpc]) işlem kodudur. Aksi takdirde, işlem kodu STOPopens in a new tab olarak tanımlanır.

Bu bir yığın makinesiopens in a new tab olduğu için, her işlem kodu tarafından çıkarılan (δ) ve itilen (α) öğelerin sayısını takip etmemiz gerekir.

9.4.2 İstisnai Durdurma

Bu bölüm, anormal bir sonlandırma olduğunda belirten Z fonksiyonunu tanımlar. Bu bir Booleopens in a new tab işlevidir, bu nedenle mantıksal veya için opens in a new tab ve mantıksal ve için opens in a new tab kullanır.

Bu koşullardan herhangi biri doğruysa istisnai bir durdurma olur:

  • μg < C(σ,μ,A,I) 9.2. bölümde gördüğümüz gibi, C gaz maliyetini belirten fonksiyondur. Bir sonraki işlem kodunu karşılayacak kadar gaz kalmadı.

  • δw=∅ Bir işlem kodu için çıkarılan öğe sayısı tanımsızsa, işlem kodunun kendisi de tanımsızdır.

  • || μs || < δw Yığın yetersizliği, mevcut işlem kodu için yığında yeterli öğe yok.

  • w = JUMP ∧ μs[0]∉D(Ib) İşlem kodu JUMPopens in a new tab ve adres bir JUMPDESTopens in a new tab değil. Atlamalar yalnızca hedefin bir JUMPDESTopens in a new tab olduğu durumlarda geçerlidir.

  • w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) İşlem kodu JUMPIopens in a new tab, koşul doğru (sıfır değil) bu yüzden atlama gerçekleşmeli ve adres bir JUMPDESTopens in a new tab değil. Atlamalar yalnızca hedefin bir JUMPDESTopens in a new tab olduğu durumlarda geçerlidir.

  • w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || İşlem kodu RETURNDATACOPYopens in a new tab. Bu işlem kodunda yığın elemanı μs[1], geri dönüş veri arabelleğinde okunacak ofsettir ve yığın elemanı μs[2] verinin uzunluğudur. Bu durum, geri dönüş veri arabelleğinin sonunun ötesini okumaya çalıştığınızda meydana gelir. Çağrı verileri veya kodun kendisi için benzer bir koşul olmadığını unutmayın. Bu arabelleklerin sonunun ötesini okumaya çalıştığınızda yalnızca sıfırlar elde edersiniz.

  • || μs || - δw + αw > 1024

    Yığın taşması. İşlem kodunu çalıştırmak 1024'ten fazla öğeye sahip bir yığınla sonuçlanırsa, işlemi iptal et.

  • ¬Iw ∧ W(w,μ) Statik olarak mı çalışıyoruz (¬ olumsuzlamadıropens in a new tab ve Iw, blokzincir durumunu değiştirmemize izin verildiğinde doğrudur)? Eğer öyleyse ve durum değiştiren bir işlem deniyorsak, bu gerçekleşemez.

    W(w,μ) fonksiyonu daha sonra denklem 150'de tanımlanmıştır. W(w,μ) aşağıdaki koşullardan biri doğruysa doğrudur:

    • w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT} Bu işlem kodları, yeni bir sözleşme oluşturarak, bir değer depolayarak veya mevcut sözleşmeyi yok ederek durumu değiştirir.

    • LOG0≤w ∧ w≤LOG4 Statik olarak çağrılırsak günlük girdileri yayımlayamayız. Günlük işlem kodlarının tümü LOG0 (A0)opens in a new tab ile LOG4 (A4)opens in a new tab aralığındadır. Günlük işlem kodundan sonraki sayı, günlük girdisinin kaç konu içerdiğini belirtir.

    • w=CALL ∧ μs[2]≠0 Statik durumdayken başka bir sözleşmeyi arayabilirsiniz, ancak bunu yaparsanız ona ETH aktaramazsınız.

  • w = SSTORE ∧ μg ≤ Gcallstipend Gcallstipend'den (Ek G'de 2300 olarak tanımlanmıştır) daha fazla gazınız yoksa SSTOREopens in a new tab çalıştıramazsınız.

9.4.3 Atlama Hedefi Geçerliliği

Burada JUMPDESTopens in a new tab işlem kodlarının ne olduğunu resmi olarak tanımlıyoruz. Sadece 0x5B bayt değerine bakamayız, çünkü bir PUSH'un içinde olabilir (ve bu nedenle bir işlem kodu değil, veridir).

Denklem (153)'te bir fonksiyon olan N(i,w)'yi tanımlıyoruz. İlk parametre olan i, işlem kodunun konumudur. İkinci parametre olan w, işlem kodunun kendisidir. Eğer w∈[PUSH1, PUSH32] ise, bu, işlem kodunun bir PUSH olduğu anlamına gelir (köşeli parantezler uç noktaları içeren bir aralığı tanımlar). Bu durumda bir sonraki işlem kodu i+2+(w−PUSH1) konumundadır. PUSH1opens in a new tab için iki bayt (PUSH'ın kendisi ve bir baytlık değer) ilerlememiz gerekir, PUSH2opens in a new tab için ise iki baytlık bir değer olduğu için üç bayt ilerlememiz gerekir, vb. Diğer tüm EVM işlem kodları sadece bir bayt uzunluğundadır, bu yüzden diğer tüm durumlarda N(i,w)=i+1'dir.

Bu fonksiyon, denklem (152)'de DJ(c,i)'yi tanımlamak için kullanılır, bu da c kodundaki tüm geçerli atlama hedeflerinin i işlem kodu konumundan başlayan kümesidiropens in a new tab. Bu fonksiyon özyinelemeli olarak tanımlanmıştır. i≥||c|| ise, bu, kodun sonunda veya sonrasında olduğumuz anlamına gelir. Daha fazla atlama hedefi bulamayacağız, bu yüzden sadece boş kümeyi döndürün.

Diğer tüm durumlarda, bir sonraki işlem koduna giderek ve ondan başlayan kümeyi alarak kodun geri kalanına bakarız. c[i] mevcut işlem kodudur, dolayısıyla N(i,c[i]) bir sonraki işlem kodunun konumudur. Dolayısıyla DJ(c,N(i,c[i])) bir sonraki işlem kodunda başlayan geçerli atlama hedefleri kümesidir. Mevcut işlem kodu bir JUMPDEST değilse, sadece o kümeyi döndürün. JUMPDEST ise, sonuç kümesine dahil edin ve onu döndürün.

9.4.4 Normal durdurma

Durdurma fonksiyonu H, üç tür değer döndürebilir.

  • Bir durdurma işlem kodunda değilsek, yani boş kümeyi döndürün. Geleneksel olarak, bu değer Boole yanlış olarak yorumlanır.
  • Çıktı üretmeyen bir durdurma işlem kodumuz varsa (STOPopens in a new tab veya SELFDESTRUCTopens in a new tab), geri dönüş değeri olarak sıfır boyutlu bir bayt dizisi döndürün. Bunun boş kümeden çok farklı olduğunu unutmayın. Bu değer, EVM'nin gerçekten durduğu, sadece okunacak bir geri dönüş verisi olmadığı anlamına gelir.
  • Çıktı üreten bir durdurma işlem kodumuz varsa (RETURNopens in a new tab veya REVERTopens in a new tab), o işlem kodu tarafından belirtilen bayt dizisini döndürün. Bu dizi bellekten alınır, yığının en üstündeki değer (μs[0]) ilk bayttır ve ondan sonraki değer (μs[1]) uzunluktur.

H.2 Komut seti

EVM'nin son alt bölümü olan 9.5'e geçmeden önce, talimatların kendilerine bir göz atalım. Bunlar, s. 29'da başlayan Ek H.2'de tanımlanmıştır. Belirli bir işlem koduyla değiştiği belirtilmeyen her şeyin aynı kalması beklenir. Değişen değişkenler <bir şey>′ olarak belirtilir.

Örneğin, ADDopens in a new tab işlem koduna bakalım.

DeğerAnımsatıcıδαAçıklama
0x01EKLE21Toplama işlemi.
μ′s[0] ≡ μs[0] + μs[1]

δ, yığından çıkardığımız değerlerin sayısıdır. Bu durumda iki, çünkü en üstteki iki değeri topluyoruz.

α, geri ittiğimiz değerlerin sayısıdır. Bu durumda bir, toplam.

Yani yeni yığın tepesi (μ′s[0]) eski yığın tepesinin (μs[0]) ve onun altındaki eski değerin (μs[1]) toplamıdır.

Bu makale, tüm işlem kodlarını "gözleri kamaştıran bir liste" ile gözden geçirmek yerine, yalnızca yeni bir şey sunan işlem kodlarını açıklamaktadır.

DeğerAnımsatıcıδαAçıklama
0x20KECCAK25621Keccak-256 karmasını hesaplayın.
μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])
μ′i ≡ M(μis[0],μs[1])

Bu, belleğe erişen ilk işlem kodudur (bu durumda, salt okunur). Ancak, belleğin mevcut sınırlarının ötesine genişleyebilir, bu nedenle μi'yi güncellememiz gerekir. Bunu s. 29'daki denklem 328'de tanımlanan M fonksiyonunu kullanarak yaparız.

DeğerAnımsatıcıδαAçıklama
0x31BALANCE11Verilen hesabın bakiyesini alın.
...

Bakiyesini bulmamız gereken adres μs[0] mod 2160'tır. Yığının tepesi adrestir, ancak adresler yalnızca 160 bit olduğu için değeri moduloopens in a new tab 2160 olarak hesaplarız.

σ[μs[0] mod 2160] ≠ ∅ ise, bu adres hakkında bilgi olduğu anlamına gelir. Bu durumda, σ[μs[0] mod 2160]b o adresin bakiyesidir. σ[μs[0] mod 2160] = ∅ ise, bu adresin başlatılmadığı ve bakiyenin sıfır olduğu anlamına gelir. Hesap bilgisi alanlarının listesini s. 4'teki 4.1. bölümde görebilirsiniz.

İkinci denklem, A'a ≡ Aa ∪ {μs[0] mod 2160}, sıcak depolamaya (yakın zamanda erişilmiş ve büyük olasılıkla önbelleğe alınmış depolama) ve soğuk depolamaya (erişilmemiş ve büyük olasılıkla daha yavaş ve alınması daha pahalı olan depolama) erişim arasındaki maliyet farkıyla ilgilidir. Aa, s. 8'deki 6.1. bölümde tanımlandığı gibi, işlem tarafından daha önce erişilen ve bu nedenle erişimi daha ucuz olması gereken adreslerin listesidir. Bu konu hakkında daha fazla bilgiyi EIP-2929opens in a new tab adresinde okuyabilirsiniz.

DeğerAnımsatıcıδαAçıklama
0x8FDUP16161716. yığın öğesini çoğaltın.
μ′s[0] ≡ μs[15]

Herhangi bir yığın öğesini kullanmak için onu çıkarmamız gerektiğini, bunun da üzerindeki tüm yığın öğelerini çıkarmamız gerektiği anlamına geldiğini unutmayın. DUP<n>opens in a new tab ve SWAP<n>opens in a new tab durumunda, bu, on altı kadar değeri çıkarıp sonra itmek anlamına gelir.

9.5 Yürütme döngüsü

Artık tüm parçalara sahip olduğumuza göre, EVM'nin yürütme döngüsünün nasıl belgelendiğini nihayet anlayabiliriz.

Denklem (155), durum verildiğinde şunu söyler:

  • σ (küresel blokzincir durumu)
  • μ (EVM durumu)
  • A (alt durum, işlem bittiğinde gerçekleşecek değişiklikler)
  • I (yürütme ortamı)

Yeni durum (σ', μ', A', I')'dir.

(156)-(158) denklemleri yığını ve bir işlem kodu nedeniyle yığındaki değişikliği (μs) tanımlar. Denklem (159) gazdaki değişimdir (μg). Denklem (160) program sayacındaki değişimdir (μpc). Son olarak, (161)-(164) denklemleri, işlem kodu tarafından açıkça değiştirilmediği sürece diğer parametrelerin aynı kaldığını belirtir.

Bununla EVM tamamen tanımlanmıştır.

Sonuç

Matematiksel gösterim kesindir ve Sarı Kağıt'ın Ethereum'un her ayrıntısını belirtmesine olanak tanımıştır. Ancak bazı dezavantajları vardır:

  • Yalnızca insanlar tarafından anlaşılabilir, bu da uyumluluk testlerininopens in a new tab manuel olarak yazılması gerektiği anlamına gelir.
  • Programcılar bilgisayar kodunu anlar. Matematiksel gösterimi anlıyor olabilirler veya anlamıyor olabilirler.

Belki de bu nedenlerden dolayı, daha yeni olan mutabakat katmanı özellikleriopens in a new tab Python ile yazılmıştır. Python'da yürütme katmanı özellikleriopens in a new tab vardır, ancak bunlar tam değildir. Tüm Sarı Kağıt Python'a veya benzer bir dile çevrilene kadar Sarı Kağıt hizmette kalmaya devam edecek ve onu okuyabilmek faydalı olacaktır.

Sayfanın son güncellenmesi: 1 Şubat 2026

Bu rehber yararlı oldu mu?