1. Anasayfa
  2. Solidity

Solidity Toplu Ödeme Fonksiyonu

Harika Bir Toplu Ödeme Fonksiyonunu Solidity ile Kodlama: Bilinmesi Gereken Bir Teknik

Solidity Toplu Ödeme Fonksiyonu
Solidity Toplu Ödeme Fonksiyonu
0

Solidity Toplu Ödeme Fonksiyonu

Başarılı bir blockchain geliştiricisi olmayı mı düşünüyorsunuz? O zaman bu eğitim tam size göre.

Blockchain geliştiricilerine yönelik küresel talep şu anda fazlaca yüksek. Teknoloji şirketleri ve yeni başlayanlar, bu alanda harika teknolojiler oluşturmalarına yardımcı olabilecek blok zinciri geliştiricileri arıyor.

Ancak bu yüksek ücretli işlere girmek için ihtiyaç duyacağınız temel becerilerden biri, sağlamlığı ve akıllı sözleşme ödeme işlemlerini öğrenmektir.

Bu arada, web3 geliştirme konusunda sizi hızlandıracak kişisel bir eğitmen arıyorsanız, hemen rezervasyonunuzu yapın.

Hadi bu eğitime geçelim…

Solidity’de neden toplu ödeme işlemlerinde ustalaşmanız gerekir?

Solidity, hesaplar arasında ödeme işlemlerini yürütmek için özel bir programlama dilidir. Bu, web’deki programlama dilleri arasında nadir görülen bir özelliktir. Solidity, aracılara ve büyük şirketlere olan ihtiyacı ortadan kaldırarak Ethereum dijital para birimi ile işlemleri yönetmek amacıyla inşa edildi.

Solidity akıllı sözleşme programlaması ile ödemenizi işleme koymak için bir bankaya veya herhangi bir bankacıya ihtiyacınız yoktur, tüm ödemeleriniz ağda işlenir.

Ancak solidity ‘nin size dijital işlemleri daha hızlı, güvenli ve büyük ölçekte yapma gücü vermesi gerçeği, bunu öğrenmeden mükemmel bir şekilde yapabileceğiniz anlamına gelmez.

Bu finansal ağ bize paraları noktalar arasında hızlı, güvenli ve sınırsız bir şekilde taşımanın bir yolunu sağladığı kadar, hacker olarak bilinen hırsızların da yırtıcı gözlerini cezbetmiştir.

Evet, sisteminizdeki zayıflığa, özellikle akıllı sözleşmenizde paranın nasıl taşındığına dikkat ederler. Bu zayıflıktan yararlanmanın bir yolunu bulduklarında, sisteminizi yağmalayacaklar ve işinizi işlevsiz hale getirecekler.

Bunun olmaması için, akıllı sözleşmelerinizle toplu ödemeleri nasıl işleyeceğinizi anlamalısınız.

Toplu Ödeme Akıllı Sözleşme Örneği

Bunu size Payroll (Bordro;) adında oluşturduğum örnek bir akıllı sözleşme ile göstermek istiyorum. Tam akıllı sözleşme kodu aşağıdadır…

//SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;

contract Payroll {
    address public companyAcc;
    uint256 public companyBal;
    uint256 public totalWorkers = 0;
    uint256 public totalSalary = 0;
    uint256 public totalPayment = 0;

    mapping(address => bool) isWorker;

    event Paid(
        uint256 id,
        address from,
        uint256 totalSalary,
        uint256 timestamp
    );

    struct PaymentStruct {
        uint256 id;
        address worker;
        uint256 salary;
        uint256 timestamp;
    }

    PaymentStruct[] employees;

    modifier ownerOnly(){
        require(msg.sender == companyAcc, "Owner reserved only");
        _;
    }

    constructor() {
        companyAcc = msg.sender;
    }

    function addWorker(
        address worker,
        uint256 salary
    ) external ownerOnly returns (bool) {
        require(salary > 0 ether, "Salary cannot be zero!");
        require(!isWorker[worker], "Record already existing!");

        totalWorkers++;
        totalSalary += salary;
        isWorker[worker] = true;

        employees.push(
            PaymentStruct(
                totalWorkers,
                worker,
                salary,
                block.timestamp
            )
        );
        
        return true;
    }

    function payWorkers() payable external ownerOnly returns (bool) {
        require(msg.value >= totalSalary, "Ethers too small");
        require(totalSalary <= companyBal, "Insufficient balance");

        for(uint i = 0; i < employees.length; i++) {
            payTo(employees[i].worker, employees[i].salary);
        }

        totalPayment++;
        companyBal -= msg.value;

        emit Paid(
            totalPayment,
            companyAcc,
            totalSalary,
            block.timestamp
        );

        return true;
    }

    function fundCompanyAcc() payable external returns (bool) {
        require(companyAcc != msg.sender, "You can't fund yourself!");
        payTo(companyAcc, msg.value);
        companyBal += msg.value;
        return true;
    }

    function getWorkers() external view returns (PaymentStruct[] memory) {
        return employees;
    }

    function payTo(
        address to, 
        uint256 amount
    ) internal returns (bool) {
        (bool success,) = payable(to).call{value: amount}("");
        require(success, "Payment failed");
        return true;
    }
}

Harika, yukarıda bir şirketin çalışanlarına maaşlarına göre ödeme yapmak için akıllı bir sözleşme var. Şimdi bu akıllı sözleşmeyi adım adım nasıl başardığımıza bir göz atalım.

Adım 1: Bu ilk adımda akıllı sözleşme yapımızı kuruyoruz. MIT lisans tanımlayıcısını ve 0.7.0 ila 0.9.0 derleyici aralığını kullanıyoruz. Ardından, akıllı sözleşmeyi Payroll adıyla tanımladık.

//SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract Payroll {
  // Codes goes here...
}

Adım 2: Burada akıllı sözleşmemiz için temel durum değişkenlerini tanımlıyoruz. CompanyAcc, dağıtım hesabını veya adresini belirtir. CompanyBal, şirkete gelen tüm fonu elinde tutar. Ardından, akıllı sözleşmemizde toplam işçileri, maaşları ve ödemeleri takip etmek için bazı değişkenler belirledik.

address public companyAcc; // Owner's account
uint256 public companyBal; // Companies fund
uint256 public totalWorkers = 0;
uint256 public totalSalary = 0;
uint256 public totalPayment = 0;
mapping(address => bool) isWorker; // Identifies workers

Adım 3: Bu adım, akıllı sözleşme olay günlüğünü belirtir. Her başarılı ödemede bazı hayati verilerin oturumunun kapatılmasını istiyoruz. Burada oturumu kapatılacak veriler, ödeme kimliğini, ödemeyi yapanı, ödenen toplam maaşı ve ödeme zamanını içerir.

event Paid(
    uint256 id,
    address from,
    uint256 totalSalary,
    uint256 timestamp
);

Adım 4: Bu, ödeme yapısını belirtir. Struct, yapıyı ifade eden bir solidity anahtar sözcüğüdür. Her çalışanın aşağıdaki kayıtlara sahip olmasını istiyoruz:

  • İşaretsiz bir tamsayı olması gereken kimlik.
  • Çalışan olarak belirtilen bir cüzdan adresi.
  • Belirli bir maaş.
  • Şirkete katılma zamanını temsil eden bir zaman damgası.
struct PaymentStruct {
  uint256 id;
  address worker;
  uint256 salary;
  uint256 timestamp;
}
PaymentStruct[] employees; //An array of employees

Adım 5: Bu adımda, OwnerOnly adında bir değiştirici oluşturduk. Tek amacı, bir işlevi yetkisiz erişime karşı korumaktır. Bu değiştiriciyi hangi işleve dahil edersek edelim, yalnızca bu durumda akıllı sözleşmenin uygulayıcısı olan şirketin sahibine erişime izin verecektir.

modifier ownerOnly(){
    require(msg.sender == companyAcc, "Owner reserved only");
    _;
}

Adım 6: Burada dağıtımcı adresini şirketin hesabı olacak şekilde ayarlıyoruz.

constructor() {
    companyAcc = msg.sender;
}

Adım 7: Bu fonksiyon, çalışan kayıtlarına yeni bir çalışan eklemekten sorumludur. Yalnızca şirketin hesabı olan akıllı sözleşmenin dağıtıcısı tarafından çalıştırılabilir.

function addWorker(
    address worker,
    uint256 salary
) external ownerOnly returns (bool) {
    // Checks for salary and work's existence...
    require(salary > 0 ether, "Salary cannot be zero!");
    require(!isWorker[worker], "Record already existing!");
    
    // Performs essential computations...
    totalWorkers++;
    totalSalary += salary;
    isWorker[worker] = true;

    // Includes worker in the employees array...
    employees.push(
        PaymentStruct(
            totalWorkers,
            worker,
            salary,
            block.timestamp
        )
    );
    
    return true;
}

Adım 8: Bu fonksiyon, şirketin çalışanlarına ödeme yapmaktan sorumludur. Toplu işlemleri gerçekleştiren fonksiyondur. Buna iyi dikkat etmelisiniz.

function payWorkers() payable external ownerOnly returns (bool) {
    // Ensures that salary can be paid...
    require(msg.value >= totalSalary, "Ethers too small");
    require(totalSalary <= companyBal, "Insufficient balance");
  
    // Performs recursive payment to each employee...
    for(uint i = 0; i < employees.length; i++) {
        payTo(employees[i].worker, employees[i].salary);
    }
    
    // Performs essential computations...
    totalPayment++;
    companyBal -= msg.value;
  
    // Emits payment event...
    emit Paid(
        totalPayment,
        companyAcc,
        totalSalary,
        block.timestamp
    );

    return true;
}

Toplu ödemeyi işlemenin sırrı, onu bir döngü yapısına koymak ve tüm durumlar üzerinde çalışılana kadar döngünün güvenli ödeme işlevini tekrar tekrar çağırmasını sağlamaktır.

Adım 9: Bu fonksiyon dışarıdan ödeme alır ve şirketin hesabına para yatırır.

function fundCompanyAcc() payable external returns (bool) {
    require(companyAcc != msg.sender, "You can't fund yourself!");
    payTo(companyAcc, msg.value);
    companyBal += msg.value;
    return true;
}

Adım 10: Bu işlev, artık şirketin bir parçası olan çalışanların listesini döndürür.

function getWorkers() external view returns (PaymentStruct[] memory) {
    return employees;
}

Adım 11: Bu fonksiyon, bir adresten diğerine para göndermekten sorumludur. İşçilere toplu ödeme sırasında tekrar tekrar çağrıldı.

function payTo(
    address to, 
    uint256 amount
) internal returns (bool) {
    (bool success,) = payable(to).call{value: amount}("");
    require(success, "Payment failed");
    return true;
}

Toplu Ödeme İşlemeyle İlgili Dikkat

Lütfen toplu ödeme işlemenin, eyleme geçirilen özerk bir faaliyet olduğunu unutmayın; bu nedenle, işlemden önce biraz kontrol yapmak akıllıca olacaktır. İşte dikkat etmeniz gereken bazı ipuçları.

Verileri Doğrulayın Ödemeleri işleme koymadan önce verilerin doğruluğunu doğruladığınızdan emin olun. Sisteme yalnızca doğru kayıtların girilmesini sağlamak için gerekli işlevleri ve adminOnly gibi özel değiştiricileri kullanmak.

Ödemeyi İşle Durum değişkenlerini değiştirmeden önce hesabı borçlandırdığınızdan emin olun. Bu, yeniden giriş saldırılarına karşı korunmaya yardımcı olacaktır.

Kaydı Yeniden Ayarla Durum değişkenlerini yalnızca yukarıdaki etkinlikleri yaptıktan sonra güncelleyin. Örneğin, kötü niyetli bir kullanıcı aynı anda birden çok istek göndererek ödeme işlevinize saldırmayı planlıyorsa. İki kez ödeme yapmak zorunda kalacak ve her talepte durum değişkenleri güncellenmeden önce ödeme yapılması gerekiyor.

Sonuç Bağlamı

Bir web3 geliştiricisi olma konusunda ciddiyseniz, ödeme işleme olmazsa olmaz bir beceridir. Yeniden giriş gibi saldırılara karşı nasıl savunma yapılacağını bilmek de önemlidir.

Akıllı sözleşme geliştirme 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.

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!

Bir sonraki eğitimde görüşmek dileğiyle, o zamana kadar iyi eğlenceler!

Hasan YILDIZ, Girişimci. Doktora Öğrencisi. Yazmayan YAZILIMCI. Veri Şeysi. Eğitmen...

Yazarın Profili

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