1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 029 : Payable

🧵 #100GündeSolidity 029 : Payable
Payable
0

Payable

Solidity programlama dilinde “Payable”, bir contract’in ether alabilmesini sağlayan özelliği ifade eder. Contract’in fonksiyonları veya adresleri “payable” olarak tanımlanarak, kullanıcılar contract’a ether gönderebilirler. Bu özellik, özellikle ICO’lar gibi kripto para toplama etkinlikleri için çok önemlidir. Payable fonksiyonlar ve adresler, Ether’ın güvenli bir şekilde kabul edilmesini sağlamak için dikkatli bir şekilde tasarlanmalı ve uygulanmalıdır. Ayrıca, gönderilen ether’ın takibi ve raporlanması da önemlidir. Bu nedenle, “Payable” konusu Solidity programlama dilinde öğrenilmesi gereken önemli konulardan biridir.

“Payable” ne anlama gelir ve ne işe yarar?

“Payable” kelimesi Solidity programlama dilinde, bir contract’in ether alabilmesini sağlayan bir özellik olarak kullanılır. Yani, bir contract’e ether göndermek isteyen kullanıcılar, contract’in fonksiyonları veya adresleri üzerinden ether gönderebilirler. Bu özellik, özellikle ICO’lar gibi kripto para toplama etkinlikleri için önemlidir.

Bir fonksiyonun “payable” olarak tanımlanması, o fonksiyonun ether kabul edebileceği anlamına gelir. Benzer şekilde, bir adresin “payable” olarak tanımlanması, o adresin ether kabul edebileceği anlamına gelir. “Payable” özelliği, bir contract’e ether kabul etme işlevi sağlamasının yanı sıra, bir contract’in kullanıcılar tarafından daha geniş bir şekilde kullanılmasına da olanak tanır.

Ancak “Payable” fonksiyonlar ve adresler, Ether’ın güvenli bir şekilde kabul edilmesini sağlamak için dikkatli bir şekilde tasarlanmalı ve uygulanmalıdır. Ayrıca, gönderilen ether’ın takibi ve raporlanması da önemlidir. Bu nedenle, “Payable” konusu Solidity programlama dilinde öğrenilmesi gereken önemli konulardan biridir.

Payable olan bir fonksiyon ve adresi nasıl tanımlanır?

Solidity programlama dilinde, bir fonksiyon veya adresin “payable” olarak tanımlanması için “payable” anahtar kelimesi kullanılır.

Örneğin, bir fonksiyonun payable olarak tanımlanması için fonksiyon tanımında şu şekilde bir ifade kullanılabilir:

function myPayableFunction() payable public returns (uint) {
    // Fonksiyon kodları burada yer alır
}

Yukarıdaki örnekte, fonksiyon “payable” olarak tanımlanmıştır ve “payable” anahtar kelimesi fonksiyon tanımına eklenmiştir. Fonksiyon, “public” olarak tanımlanmıştır, bu nedenle herkes tarafından çağrılabilir ve ether gönderebilir. Fonksiyon, “returns” anahtar kelimesiyle birlikte bir değer döndürür.

Benzer şekilde, bir adresin “payable” olarak tanımlanması için şu şekilde bir ifade kullanılabilir:

address payable myPayableAddress = payable(address(this));

Yukarıdaki örnekte, bir “payable” adresi tanımlamak için “address payable” veri tipi kullanılmıştır. Ayrıca, “payable” anahtar kelimesi de kullanılarak, bu adresin ether kabul edebileceği belirtilmiştir. Adres, “this” anahtar kelimesi ile contract’in kendisi olarak tanımlanmıştır.

Payable fonksiyonlar ve adresler, Ether’ın güvenli bir şekilde kabul edilmesini sağlamak için dikkatli bir şekilde tasarlanmalı ve uygulanmalıdır. Ayrıca, gönderilen ether’ın takibi ve raporlanması da önemlidir.

Ether nedir ve Ethereum’daki önemi nedir?

Ether, Ethereum blockchain’inin yerel kripto para birimidir. Ethereum, Bitcoin gibi diğer kripto para birimlerinin aksine, sadece bir dijital para birimi değil, aynı zamanda merkezi olmayan uygulamaların (dApps) geliştirilmesine ve çalıştırılmasına olanak tanıyan bir blockchain platformudur. Ethereum platformunda, smart contract’lar adı verilen programlar yazarak, uygulamalar ve hizmetler oluşturulabilir.

Ether, Ethereum platformunda yapılan işlemleri gerçekleştirmek için gereklidir. Örneğin, bir smart contract’in çalıştırılması veya bir dApp’te işlem yapmak için Ether gereklidir. Ether ayrıca, Ethereum madencilerine blok ödülü olarak verilir ve işlem ücretleri olarak kullanılır.

Ethereum, smart contract’ların çalışması için bir platform sağlaması ve bu platformda kullanılan birim olan Ether sayesinde, merkezi olmayan uygulamaların ve hizmetlerin oluşturulmasını mümkün kılar. Ethereum’un bu özelliği, blok zinciri teknolojisinin sadece dijital para birimleri ile sınırlı olmadığını, aynı zamanda diğer uygulama alanlarında da kullanılabileceğini gösterir.

Sonuç olarak, Ether Ethereum blockchain’inin yerel kripto para birimi olup, platformda gerçekleştirilen işlemler için gereklidir. Ethereum platformu ise, merkezi olmayan uygulamaların ve hizmetlerin oluşturulması için bir platform sağlar.

Contract’lara ether göndermenin yöntemleri ve bu işlemde kullanılan fonksiyonlar

Ether göndermek için Solidity programlama dilinde çeşitli fonksiyonlar ve yöntemler mevcuttur. Öncelikle, Ether göndermek istediğiniz contract’in payable olarak tanımlanmış olması gerekmektedir. Aksi takdirde, Ether gönderimi kabul edilmeyecektir.

  1. transfer() fonksiyonu: Bu fonksiyon, Ether göndermek için en yaygın kullanılan yöntemdir. Bu fonksiyon, bir address tipi değişken üzerinde çağrıldığında, bu adresteki contract’e Ether gönderir. Gönderilen Ether miktarı, fonksiyonun parametre olarak aldığı bir uint değeri ile belirtilir.

Örnek kullanım:

address payable receiver = payable(0x123...);
uint amount = 1 ether;
receiver.transfer(amount);

Yukarıdaki örnekte, transfer() fonksiyonu kullanılarak, 0x123… adresine 1 Ether gönderilir.

  1. send() fonksiyonu: Bu fonksiyon, transfer() fonksiyonuna benzer şekilde çalışır, ancak gönderme işlemi tamamlandığında bir bool değer döndürür. Gönderilen Ether miktarı, fonksiyonun parametre olarak aldığı bir uint değeri ile belirtilir.

Örnek kullanım:

address payable receiver = payable(0x123...);
uint amount = 1 ether;
bool success = receiver.send(amount);

Yukarıdaki örnekte, send() fonksiyonu kullanılarak, 0x123… adresine 1 Ether gönderilir ve gönderme işlemi tamamlandığında bir bool değer olan success değişkenine değer atanır.

  1. transferFrom() fonksiyonu: Bu fonksiyon, ERC20 uyumlu token’ları transfer etmek için kullanılır. Token transferi işlemi, gönderen adresten alıcı adrese transferFrom() fonksiyonu ile gerçekleştirilir.

Örnek kullanım:

address payable sender = payable(0xabc...);
address payable receiver = payable(0x123...);
uint amount = 100;
token.transferFrom(sender, receiver, amount);

Yukarıdaki örnekte, ERC20 uyumlu token transferi, sender adresinden receiver adresine transferFrom() fonksiyonu kullanılarak gerçekleştirilir.

Ether göndermek için kullanılan bu fonksiyonlar, doğru şekilde kullanılmadığında güvenlik riskleri oluşturabilir. Bu nedenle, Ether gönderimi işlemlerinde dikkatli ve güvenli bir şekilde uygulanmalıdır.

Contract’lara gönderilen ether’ın nasıl kullanılabileceği ve ne şekilde saklanabileceği

Bir contract’e gönderilen Ether, o contract’in bakiyesine eklenir. Gönderilen Ether, daha sonra contract tarafından belirlenmiş bir amaç için kullanılabilir veya saklanabilir. İşte Ether’ın contract’lerde kullanımı için bazı örnekler:

  1. Ödeme işlemleri: Contract’ler, ödeme almak için kullanılabilir. Bir contract’in payable olarak tanımlanması, Ether alabilmesi anlamına gelir. Bu sayede, contract’e Ether gönderen kişi veya diğer contract’ler, belirli bir amaç için ödeme yapabilir.
  2. Token satın alma işlemleri: Contract’ler, token satın almak için kullanılabilir. Örneğin, bir ERC20 uyumlu token’in satın alınması için, gönderilen Ether karşılığı token’lar contract tarafından otomatik olarak transfer edilebilir.
  3. Fon yönetimi: Contract’ler, fonların yönetimi için kullanılabilir. Bir contract, örneğin bir fon toplama kampanyası için oluşturulabilir ve kampanyaya katılanlar Ether göndererek fona katkıda bulunabilir.

Gönderilen Ether, contract içinde saklanabilir ve kullanılabilir. Contract’lerdeki bakiye, uint256 tipindeki bir değişkende saklanabilir ve daha sonra kullanılmak üzere kullanılabilir.

Örnek kullanım:

contract ExampleContract {
    uint256 public balance;
    
    function deposit() public payable {
        balance += msg.value; // gönderilen Ether'ın bakiyeye eklenmesi
    }
    
    function withdraw(uint256 amount) public {
        require(balance >= amount, "Not enough balance"); // bakiye kontrolü
        balance -= amount; // bakiyeden para çekilmesi
        payable(msg.sender).transfer(amount); // para çekme işlemi
    }
}

Yukarıdaki örnekte, ExampleContract adlı bir contract örneği oluşturulur. deposit() fonksiyonu, payable olarak tanımlanarak Ether alabilir ve bakiyeye ekler. withdraw() fonksiyonu, bakiyeden para çekilmesine izin verir ve msg.sender adresine belirtilen miktarda Ether transfer eder.

Payable fonksiyonların ve adreslerin güvenliği ve dikkat edilmesi gereken noktalar

Payable fonksiyonlar ve adresler, bir contract’e Ether göndermek için kullanıldığından güvenlik açısından dikkat edilmesi gereken bazı noktalar vardır:

  1. Ether gönderen adresin kontrolü: Payable fonksiyonları çağıran adresin kimliğinin doğrulanması önemlidir. Bu nedenle, fonksiyon çağrısı yapılırken msg.sender adresi kontrol edilmelidir.
  2. Doğru miktarın alınması: Payable fonksiyonlar, alacakları Ether miktarını kendileri belirleyebilirler. Bu nedenle, gönderilen Ether miktarının doğru bir şekilde belirlenmesi ve kontrol edilmesi önemlidir. Aksi takdirde, kullanıcıların yanlışlıkla fazla Ether göndermeleri veya yetersiz göndermeleri durumunda para kaybı yaşanabilir.
  3. DDoS saldırılarına karşı koruma: Payable fonksiyonlar, Ether gönderimleri için açık olduğundan, saldırganlar tarafından yoğun bir şekilde kullanılabilir ve contract’i işlemez hale getirebilirler. Bu tür saldırılara karşı korunmak için, fonksiyon çağrılarının doğru bir şekilde sınırlandırılması ve belirli bir zaman dilimi içinde sadece belirli bir sayıda çağrı yapılması gibi önlemler alınabilir.
  4. Re-entrancy saldırılarına karşı koruma: Re-entrancy saldırıları, bir contract’in içindeki bir fonksiyonun, başka bir contract’ta yer alan fonksiyonları çağırması durumunda gerçekleşir. Bu tür saldırılara karşı korunmak için, fonksiyonlar, bakiyeleri güncellemek için kullanılan değişkenlerin güvenli bir şekilde saklanması ve fonksiyonlar arasındaki etkileşimlerin dikkatli bir şekilde kontrol edilmesi gerekir.
  5. Güvenlik denetimleri: Payable fonksiyonlar, Ether’ın contract’e gönderilmesi anlamına geldiğinden, bu fonksiyonların güvenli bir şekilde tasarlanması ve test edilmesi önemlidir. Güvenlik açıklarını tespit etmek için, contract’lerin güvenlik denetimleri yapılabilir ve akıllı sözleşme güvenlik uzmanlarından yardım alınabilir.

Özetle, payable fonksiyonlar ve adresler, Ethereum’daki Ether işlemleri için önemlidir. Ancak, bu fonksiyonların güvenli bir şekilde tasarlanması ve kullanılması önemlidir. Geliştiricilerin, güvenlik konularına dikkat etmeleri ve uygun önlemleri almaları gerekir.

Payable fonksiyonlara gönderilen ether’ın takibi ve raporlanması için gereken araçlar

Payable fonksiyonlara gönderilen Ether’ın takibi ve raporlanması, Ethereum ağında yapılan işlemlerin izlenmesi ve analiz edilmesiyle mümkündür. Bu amaçla, aşağıdaki araçlar kullanılabilir:

  1. Etherscan: Etherscan, Ethereum blockchain’inin bir tarayıcısıdır. Bu araç sayesinde, yapılan tüm Ether işlemleri ve contract’lar üzerinde gerçekleştirilen işlemler izlenebilir. Etherscan aynı zamanda, belirli bir adrese gönderilen veya bu adresten gönderilen Ether miktarlarını da raporlayabilir.
  2. Etherchain: Etherchain, Ethereum blockchain’i üzerindeki işlemleri izlemek için kullanılan bir araçtır. Bu araç, kullanıcıların belirli bir adrese gönderilen veya bu adresten gönderilen Ether miktarlarını raporlayabilir.
  3. Truffle: Truffle, Ethereum ağı için bir geliştirme aracıdır. Bu araç, akıllı sözleşmelerin yazılması, test edilmesi ve dağıtılması için kullanılır. Truffle, akıllı sözleşmelerdeki fonksiyon çağrıları ve Ether işlemlerini izlemek için kullanılabilir.
  4. Web3.js: Web3.js, Ethereum blockchain’ini programatik olarak kullanmak için kullanılan bir JavaScript kütüphanesidir. Bu kütüphane, akıllı sözleşmeler üzerinde işlem yapmak ve Ethereum ağındaki işlemleri izlemek için kullanılabilir.
  5. Infura: Infura, Ethereum ağına erişim sağlamak için kullanılan bir altyapı hizmetidir. Bu hizmet sayesinde, kullanıcılar Ethereum ağına erişebilir ve akıllı sözleşmeleri, Ether işlemlerini ve diğer blockchain verilerini izleyebilirler.

Bu araçlar, payable fonksiyonlara gönderilen Ether miktarlarının takibi ve raporlanması için kullanılabilir. Bu sayede, contract sahipleri Ether miktarlarını takip edebilir ve gerektiğinde Ether’ı çekebilirler.

Akıllı Sözleşme Örneği İNCELEME

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Payable {
    // Payable address can receive Ether
    address payable public owner;

    // Payable constructor can receive Ether
    constructor() payable {
        owner = payable(msg.sender);
    }

    // Function to deposit Ether into this contract.
    // Call this function along with some Ether.
    // The balance of this contract will be automatically updated.
    function deposit() public payable {}

    // Call this function along with some Ether.
    // The function will throw an error since this function is not payable.
    function notPayable() public {}

    // Function to withdraw all Ether from this contract.
    function withdraw() public {
        // get the amount of Ether stored in this contract
        uint amount = address(this).balance;

        // send all Ether to owner
        // Owner can receive Ether since the address of owner is payable
        (bool success, ) = owner.call{value: amount}("");
        require(success, "Failed to send Ether");
    }

    // Function to transfer Ether from this contract to address from input
    function transfer(address payable _to, uint _amount) public {
        // Note that "to" is declared as payable
        (bool success, ) = _to.call{value: _amount}("");
        require(success, "Failed to send Ether");
    }
}

Bu akıllı sözleşme “Payable” konusunu örneklemek için yazılmıştır. Kod açıklamalarıyla birlikte aşağıdaki işlevlere sahiptir:

  • Payable adresi ether alabilir: “owner” adlı bir payable adres tanımlanmıştır.
  • Payable constructor, ether alabilir: Yapılandırıcı fonksiyonu payable’dir ve deploy edildiğinde kontratın yaratıcısının adresi “owner” adresine atanır.
  • Fonksiyona ether yatırmak için “deposit” fonksiyonu: Bu fonksiyon, kontrata ether yatırmak için kullanılabilir. Fonksiyona birlikte gönderilen ether miktarı depolanan kontrat bakiyesine eklenir.
  • Fonksiyon ödemesiz olduğunda hata fırlatan “notPayable” fonksiyonu: Bu fonksiyon payable değildir, dolayısıyla ether alamaz. Eğer bu fonksiyona ether gönderilirse, işlem başarısız olacak ve hata mesajı gösterilecektir.
  • Kontrattan tüm ether’ı çekmek için “withdraw” fonksiyonu: Bu fonksiyon, kontratta depolanan tüm ether’ı yaratıcı olan “owner” adresine gönderir.
  • Kontrattan başka bir adrese ether transferi yapmak için “transfer” fonksiyonu: Bu fonksiyon, belirli bir miktar ether’ı başka bir adrese göndermek için kullanılır. Fonksiyon çağrıldığında, ether miktarı belirtilen adrese gönderilir.

Sonuç Bağlamı

“Payable” özelliği, Ethereum platformunda akıllı sözleşmelerin fonksiyonlarının Ether almasına ve saklamasına olanak tanır. Payable fonksiyonlar ve adresler, Ethereum ekosistemi içinde önemli bir role sahiptir ve birçok ödeme akışı senaryosu için gereklidir. Ancak, payable fonksiyonların kullanımında bazı güvenlik riskleri de vardır ve bu riskler dikkate alınmalıdır. Ethereum geliştiricileri, payable fonksiyonların kullanımını güvenli hale getirmek için bir dizi araç ve yöntem sağlamaktadır. Bu özellikleri doğru kullanarak, Ethereum platformunda güvenli ödeme akışları sağlayabilirsiniz.

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir