İşlemler
Son düzenleme: @selcuk45(opens in a new tab), 16 Temmuz 2024
İşlemler, hesaplardan kriptografik olarak imzalanmış talimatlardır. Bir hesap, Ethereum ağının durumunu güncellemek için bir işlem başlatacaktır. En basit işlem ETH'yi bir hesaptan diğerine aktarmaktır.
Ön koşullar
Bu sayfayı daha iyi anlamanıza yardımcı olmak için önce Hesaplar ve Ethereum'a giriş bölümlerini okumanızı öneririz.
İşlem ne demek?
Bir Ethereum işlemi, harici olarak sahiplenilmiş bir hesap tarafından başlatılan bir eylemi ifade eder, başka bir deyişle, bir sözleşme değil, bir insan tarafından yönetilen bir hesap. Örneğin Bob, Alice'e 1 ETH gönderirse, Bob'un hesabı borçlandırılmalı ve Alice'inki alacaklandırılmalıdır. Bu durum değiştirme eylemi bir işlem içinde gerçekleşir.
Diyagram Ethereum EVM resmediciden(opens in a new tab) uyarlanmıştır
EVM'nin durumunu değiştiren işlemlerin tüm ağa yayınlanması gerekir. Herhangi bir düğüm, Ethereum Sanal Makinesinde ugulanacak işlemleri yayınlamak için talepte bulunabilir, bu olduktan sonra da, doğrulayıcı işlemi uygulayacak ve ortaya çıkan durum değişikliğini ağın geri kalanına yayacaktır.
İşlemler için ücretler gereklidir ve doğrulanan bir blokta bulunmak zorundadırlar. Bu taslağı daha basit hale getirebilmek için gaz ücretlerini ve doğrulamayı başka bir yerde inceleyeceğiz.
Gönderilen bir işlem aşağıdaki bilgileri içerir:
from
- işlemi imzalayacak olan göndericinin adresi. Bu sözleşme hesapları işlem gönderemeyeceği için harici olarak sahiplenilmiş bir hesap olacaktır.to
- alıcı adres (harici olarak sahiplenilmiş bir hesapsa, işlem değeri aktaracaktır. Eğer bir sözleşme hesabıysa, işlem sözleşme kodunu yürütecektir)signature
- gönderenin tanımlayıcısı. Bu, gönderenin özel anahtarı işlemi imzaladığında ve gönderenin bu işleme yetki verdiğini doğruladığında oluşturulurnonce
- hesabın işlem sayısını belirten ve ardışık olarak artan bir sayaçvalue
- göndericiden alıcıya aktarılacak ETH miktarı (WEI şeklinde birimlendirilmiştir, 1ETH 1e+18wei'ye eşittir)giriş verileri
- keyfi verileri dahil etmek için opsiyonel alangasLimit
- işlem tarafından tüketilebilecek maksimum gaz birimi miktarı. EVM her bir hesaplık adım için gereken gaz birimini belirtirmaxPriorityFeePerGas
- doğrulayıcıya bir bahşiş olarak eklenmesi için harcanan gazın maksimum fiyatımaxFeePerGas
- işlem için ödenebilecek gaz birimi başına maksimum ücret (baseFeePerGas
vemaxPriorityFeePerGas
'ı kapsayıcıdır)
Gaz, işlemin bir doğrulayıcı tarafından işlenmesi için gereken hesaplamaya bir referanstır. Kullanıcılar bu hesaplama için bir ücret ödemek zorundadır. gasLimit
ve maxPriorityFeePerGas
doğrulayıcıya ödenen maksimum işlem ücretini belirler. Gaz hakkında daha fazla bilgi.
İşlem nesnesi biraz şuna benzer:
1{2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",4 gasLimit: "21000",5 maxFeePerGas: "300",6 maxPriorityFeePerGas: "10",7 nonce: "0",8 value: "10000000000"9}Tümünü gösterKopyala
Ancak, gönderenin özel anahtarı kullanılarak bir işlem nesnesinin imzalanması gerekir. Bu, işlemin yalnızca göndericiden gelebileceğini ve sahtekârlıkla gönderilmediğini kanıtlıyor.
Geth gibi bir Ethereum istemcisi bu imzalama sürecini yerine getirir.
JSON-RPC çağrısı örneği:
1{2 "id": 2,3 "jsonrpc": "2.0",4 "method": "account_signTransaction",5 "params": [6 {7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",8 "gas": "0x55555",9 "maxFeePerGas": "0x1234",10 "maxPriorityFeePerGas": "0x1234",11 "input": "0xabcd",12 "nonce": "0x0",13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",14 "value": "0x1234"15 }16 ]17}Tümünü gösterKopyala
Yanıt örneği:
1{2 "jsonrpc": "2.0",3 "id": 2,4 "result": {5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",6 "tx": {7 "nonce": "0x0",8 "maxFeePerGas": "0x1234",9 "maxPriorityFeePerGas": "0x1234",10 "gas": "0x55555",11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",12 "value": "0x1234",13 "input": "0xabcd",14 "v": "0x26",15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"18 }19 }20}Tümünü gösterKopyala
raw
Özyinelemeli Uzunluk Ön Eki (RLP) şeklinde şifrelenmiş imzalı işlemdirtx
, imzalanmış işlemin JSON biçimidir
İmza hash değeri ile işlemin göndericiden geldiği ve ağa gönderildiği kriptografik olarak kanıtlanabilir.
Veri alanı
İşlemlerin büyük bir çoğunluğu, bir sözleşmeye dıştan sahiplenilmiş bir hesaptan erişir. Çoğu sözleşme Solidity ile yazılmıştır ve veri alanlarını ile uyumlu olacak şekilde yorumlar.
İlk dört bayt, fonksiyonun isminin ve argümanlarının hash değerini kullanarak hangi fonksiyonun çağrılacağını belirler. Bazen seçiciden bu veri tabanını(opens in a new tab) kullanarak fonksiyonu tespit edebilirsiniz.
Çağrı verisinin geri kalanı, ABI şartnamesine uygun şekilde şifrelenmiş olan(opens in a new tab) argümanlardır.
Örnek olarak, bu işleme(opens in a new tab) bakalım. Çağrı verisini görmek için Click to see More düğmesini kullanın.
0xa9059cbb
fonksiyon seçicisidir. Bu imza ile bilinen birkaç fonksiyon(opens in a new tab) var. Bu durumda sözleşme kaynak kodu(opens in a new tab) Etherscan'e yüklenmiş, yani fonksiyonun transfer(address,uint256)
olduğunu biliyoruz.
Verinin geri kalanı:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f4
ABI koşullarına göre, tamsayı değerleri (20 bayt tamsayılar olan adresler gibi) ABI içinde 32 bayt kelimelerin önü sıfırlarla doldurulmuş şekilde bulunurlar. Yani to
adresinin 4f6742badb049791cd9a37ea913f2bac38d01279
(opens in a new tab) olduğunu biliyoruz. value
ise 0x3b0559f4 = 990206452'dir.
İşlem türleri
Ethereum'da birkaç farklı işlem türü vardır:
- Düzenli işlemler: bir hesaptan diğerine yapılan işlem.
- Sözleşme dağıtım işlemleri: Veri alanının sözleşme kodu için kullanıldığı, "to"' (gönderilen adres) adresi olmayan bir işlem.
- Bir sözleşmenin yürütümü: dağıtılmış akıllı sözleşme ile etkileşime geçen bir işlem. Bu durumda, "to" adresi akıllı sözleşme adresidir.
Gaz hakkında
Belirtildiği gibi, işlemlerin yürütülmesi gaz harcar. Basit transfer işlemleri 21.000 birim Gaz gerektirir.
Dolayısıyla Bob'un 1 ETH'yi Alice'e 190 gwei baseFeePerGas
ve 10 gwei maxPriorityFeePerGas
ile göndermesi için Bob'un aşağıdaki ücreti ödemesi gerekir:
1(190 + 10) * 21.000 = 4.200.000 gwei2--veya--30,0042 ETH
Bob'un hesabı -1,0042 ETH borçlandırılacaktır (Alice için 1 ETH + gaz ücretleri için 0,0042 ETH)
Alice'in hesabı +1,0 ETH alacaklandırılır
Taban ücret yakılacaktır -0,00399 ETH
Doğrulayıcı +0,000210 ETH bahşişi tutar
Diyagram Ethereum EVM resmediciden(opens in a new tab) uyarlanmıştır
İşlemde kullanılmayan gaz, kullanıcı hesabına iade edilir.
Akıllı sözleşme etkileşimleri
Akıllı sözleşme içeren herhangi bir işlem için gaz gereklidir.
Akıllı sözleşmeler, sözleşmenin durumunu değiştirmeyen view
(opens in a new tab) ya da pure
(opens in a new tab) olarak adlandırılan fonksiyonlar da içerebilir. Bu nedenle bu fonksiyonların bir EOA tarafından çağrılması için herhangi bir gaz gerekmez. Bu senaryoda kullanılan temel RPC çağrısı "eth_call"
olarak adlandırılır
Bu view
veya pure
fonksiyonları, eth_call
kullanılarak erişildiği durumun aksine, genellikle dahili olarak (yani sözleşmenin kendisinden veya başka bir sözleşmeden) çağrılır ve bu da gaz maliyetine yol açmaz.
İşlem yaşam döngüsü
İşlem gönderildikten sonra aşağıdakiler gerçekleşir:
- Bir işlem şifresi kriptografik olarak oluşturulur:
0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
- İşlem sonrasında ağa yayınlanır ve diğer bekleyen ağ işlemlerinden oluşan işlem havuzuna eklenir.
- Bir doğrulayıcı, işlemi doğrulamak ve "başarılı" olarak değerlendirmek için işleminizi seçmeli ve bir bloka eklemelidir.
- Zaman geçtikçe işleminizi taşıyan blok önce "kanıtlanmış" sonrasında "kesinleştirilmiş" şeklinde güncellenecektir. Bu yükseltmeler işleminizin başarılı olduğunu ve asla değiştirilemeyeceğini daha netleştirir. Bir blok "kesinleştirildikten" sonra sadece milyarlarca dolar maliyetinde ağ seviyesinde bir saldırı ile değiştirilebilir.
Görsel bir demo
Austin'in işlemlerde, gazda ve madencilikte size yol göstermesini izleyin.
Yazılan İşlem Zarfı
Ethereum'un başlangıçta işlemler için tek bir formatı vardı. Her işlem, adres, değer, veri, v, r ve s için nonce, gaz fiyatı, gaz limiti içeriyordu. Bu alanlar RLP ile şifrelenmiştir, şuna benzer bir şekilde görünür:
RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])
Ethereum, erişim listelerini ve EIP-1559(opens in a new tab)'un eski işlem formatlarını etkilemeden uygulanmasını mümkün kılmak için birçok işlem türünü destekleyecek şekilde evrildi.
EIP-2718(opens in a new tab) bu davranışa izin verendir. İşlemler şu şekilde yorumlanır:
TransactionType || TransactionPayload
Burada alanlar şu şekilde tanımlanır:
TransactionType
- toplam 128 olası işlem türü için 0 ile 0x7f arasında bir sayı.TransactionPayload
- işlem türü tarafından tanımlanan rastgele bir bayt dizisi.
TransactionType
değerine göre, bir işlem şöyle sınıflandırılabilir
Tip 0 (Eski) İşlemler: Ethereum'un başlatılmasından itibaren kullanılan orijinal işlem formatıdır. EIP-1559(opens in a new tab)'dan gelen dinamik gaz ücreti hesaplamaları veya akıllı sözleşmeler için erişim listeleri gibi özellikler içermezler. Eski işlemler, Tekrarlamalı Uzunluk Öneki (RLP) kodlaması kullanıldığında
0xf8
baytıyla başlayarak serileştirilmiş formlarında türlerini belirten belirli bir öneke sahip değildir. Bu işlemler için TransactionType değeri0x0
'dır.Tip 1 İşlemler: Ethereum'un Berlin Yükseltmesi'nin bir parçası olarak EIP-2930(opens in a new tab)'da kullanıma açılan bu işlemler bir
accessList
parametresi içerir. Bu liste, işlemin erişmeyi beklediği adresleri ve depolama anahtarlarını belirtir, bu da akıllı sözleşmelerle ilgili karmaşık işlemler için gaz maliyetlerinin potansiyel olarak azaltılmasına yardımcı olur. EIP-1559 ücret piyasası değişiklikleri Tip 1 işlemlere dahil değildir. Tip 1 işlemler buna ek olarak, secp256k1 imzasının y değerinin paritesini gösteren0x0
veya0x1
olabilen biryParity
parametresi de içerir. Bu işlemler,0x01
baytıyla başladıkları için kolayca tanınır ve TransactionType değerleri0x1
'dir.Tip 2 İşlemler, sıklıkla EIP-1559 işlemleri olarak adlandırılır ve Ethereum'un Londra Yükseltmesi'nde EIP-1559(opens in a new tab) dahilinde tanıtılan işlemlerdir. Bu işlemler, Ethereum ağında standart işlem tipi haline gelmiştir. Bu işlemler, işlem ücretini ana ücret ve öncelik ücreti olarak ayıran öngörülebilirliği artıran yeni bir ücret piyasası mekanizması sunar.
0x02
baytı ile başlarlar vemaxPriorityFeePerGas
ilemaxFeePerGas
gibi alanları içerirler. Tip 2 işlemler, esneklikleri ve verimlilikleri nedeniyle varsayılan seçenek durumuna gelmiştir. Özellikle yüksek ağ tıkanıklığı dönemlerinde kullanıcıların işlem ücretlerini daha öngörülebilir şekilde yönetmelerine yardımcı olma yetenekleri nedeniyle tercih edilirler. Bu işlemler için TransactionType değeri0x2
'dir.
Daha fazla bilgi
Size yardımcı olan bir topluluk kaynağı mı biliyorsunuz? Bu sayfayı düzenleyin ve ekleyin!