1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 042 : Hashing with Keccak256e

🧵 #100GündeSolidity 042 : Hashing with Keccak256e
Hashing with Keccak256e
0

Hashing with Keccak256e

Keccak256 Hash Fonksiyonunun Solidity Dilinde Kullanımı ve Örnek Kodlar

Merhaba! Bugün #100GündeSolidity serisinin 42. gününde “Hashing with Keccak256e” konusunu ele alacağız. Bu konu, Solidity dilinde kullanılan Keccak256 fonksiyonu ve kullanım alanları hakkında bilgi vermektedir. Keccak256 fonksiyonu, bir girdi verisinin hash’ini hesaplar ve Solidity dilinde birçok farklı amaç için kullanılır. Bu amaçlar arasında benzersiz bir ID oluşturma, Commit-Reveal şeması kullanma ve kriptografik imzalar için hash değerini imzalama bulunmaktadır. Ayrıca, Keccak256’in Ethereum sanal makinesi (EVM) için özelleştirilmiş bir sürümü olan Keccak256e de bulunmaktadır. Bu konuda, Keccak256e’nin diğer sürümlerinden ve Solidity dilinde diğer hash fonksiyonlarından nasıl farklı olduğunu ve Solidity dilinde Keccak256 kullanımı için örnek kodları inceleyeceğiz.

  1. Keccak256 Nedir?
    • Keccak256, giriş verilerinin Keccak-256 hash’ini hesaplar.
    • Solidity dilinde kullanılan bir hash fonksiyonudur.
    • Girdi verilerinin değişmesi durumunda hash değeri tamamen değişir, bu nedenle hash’ler benzersizdir.
  2. Keccak256 Kullanım Alanları
    • Belirli bir girdiden belirli bir değer oluşturmak için kullanılır. Örneğin, bir girdiye dayalı bir ID oluşturmak için kullanılabilir.
    • Commit-Reveal şemasında kullanılır. Örneğin, bir oyunda bir oyuncunun hamlesini sadece sonradan açıklaması gerektiğinde, hamleyi önceden commit edip açıklama sırasında Keccak256 hash’ini açıklayabilir.
    • Kriptografik imzalar için kullanılır. Verilerin hash değerlerine imza atmak, daha büyük verilerin imzalanmasından daha az işlemci gücü gerektirir.
  3. Keccak256e ve Farklı Versiyonları
    • Keccak256e, Ethereum sanal makinesi (EVM) için özelleştirilmiş bir Keccak256 sürümüdür.
    • Keccak256 ve SHA-3, Keccak ailesinin birer üyesidir.
    • Solidity dilinde başka hash fonksiyonları da vardır, örneğin SHA-256.
  4. Örnek Solidity Kodu
    • Keccak256 kullanarak bir girdiden benzersiz bir ID oluşturma örneği.
    • Commit-Reveal şemasını uygulamak için Keccak256 kullanarak hash değerini saklama ve açıklama örneği.
    • Keccak256 hash’ini imzalamak için Solidity dilinde örnek kod.
    • Akıllı Sözleşme Örneği İnceleme
  5. Sonuç Bağlamı

Keccak256 Nedir?

Keccak256, bir girdi verisinin Keccak-256 hash’ini hesaplayan bir kriptografik hash fonksiyonudur. Keccak256, Ethereum sanal makinesi (EVM) tarafından kullanılan bir fonksiyondur ve Solidity dilinde kullanılır.

Keccak256 hash’leri, bir girdinin hash değerini hesaplamak için kullanılır ve hash değerleri, girdi verisinin tamamen değişmesi durumunda tamamen farklı bir değere sahip olur. Bu nedenle, Keccak256 hash’leri benzersizdir ve herhangi bir değişiklikte hash değeri tamamen değiştiği için girdilerin güvenli bir şekilde saklanmasını sağlar.

Keccak256 ailesi, NIST tarafından SHA-3 olarak da bilinen güvenli hash fonksiyonu standardını belirlemek için seçilen bir dizi hash fonksiyonudur. Keccak256, bu aileden bir üyedir ve SHA-3 için kullanılan algoritmanın bir varyasyonudur.

Keccak256, Solidity dilinde sık sık kullanılır ve aşağıdaki gibi birçok kullanım alanı vardır:

  • Girdi verilerinin benzersiz bir ID’sinin oluşturulması
  • Commit-Reveal şemasının kullanımı
  • Kriptografik imzaların oluşturulması

Özetlemek gerekirse, Keccak256 bir girdi verisinin hash değerini hesaplayan bir kriptografik fonksiyondur ve Solidity dilinde sık sık kullanılır.

Keccak256 Kullanım Alanları

Keccak256, Solidity dilinde birçok kullanım alanına sahip olan bir hash fonksiyonudur. Aşağıdaki gibi birkaç kullanım alanı vardır:

  1. Benzersiz ID oluşturma: Keccak256, benzersiz ID’ler oluşturmak için sık sık kullanılır. Bir girdi verisi (örneğin, bir kullanıcının adı ve soyadı gibi) Keccak256 hash fonksiyonuna sokulduğunda, ortaya çıkan hash değeri benzersiz bir ID olarak kullanılabilir. Bu, özellikle birden fazla kullanıcının kaydedildiği bir veritabanı veya blok zinciri uygulamasında kullanışlıdır.
  2. Commit-Reveal şeması: Commit-Reveal şeması, bir dizi özel senaryoda kullanılır. Örneğin, bir oyunun sonucunun adil bir şekilde belirlenmesi için kullanılabilir. Commit-Reveal şeması, oyuncuların önce bir taşınmazı (örneğin, bir sayıyı) gizlice taahhüt etmelerini ve ardından taşınmazın açıklanmasını gerektirir. Keccak256, gizli taahhüt işlemi için kullanılabilen bir hash fonksiyonudur.
  3. Kriptografik imzalar: Kriptografik imzalar, mesajların doğruluğunu ve bütünlüğünü doğrulamak için kullanılır. Kriptografik imzalar, bir girdi verisinin hash değerini imzalayarak oluşturulabilir. Bu, özellikle küçük bir imza kullanmanız gerektiğinde, imzalamanız gereken büyük bir girdi verisi yerine hash değerini imzalamanız daha avantajlıdır.
  4. Doğrulama: Keccak256 hash fonksiyonu, bir girdi verisinin bütünlüğünü doğrulamak için kullanılabilir. Örneğin, bir dosya indirdiğinizde, dosyanın orijinal sürümünün değiştirilip değiştirilmediğini doğrulamak için hash değeri kullanılabilir. Dosyanın hash değeri, orijinal dosya ile aynı olmalıdır.

Bu, Keccak256’nin Solidity dilinde kullanım alanlarına sadece birkaç örnektir ve farklı senaryolarda farklı amaçlar için kullanılabilir.

Keccak256e ve Farklı Versiyonları

Keccak256e, Keccak ailesinin bir başka üyesidir ve Keccak256’ya benzer, ancak birkaç farklılığı vardır. Keccak256’dan farklı olarak, Keccak256e, girdi verisinin önceden belirlenmiş bir uzunluğa sahip olması gerektiği yerlerde kullanılır. Örneğin, Ethereum protokolünde blok numaraları ve bazı özel değerler Keccak256e hash fonksiyonuna sokulur.

Keccak256e, Keccak256’dan farklı olarak, sadece bir tane değil, birden fazla çıkış üretir. Bu çıkışlar, hash fonksiyonuna farklı şekillerde uygulanan birkaç güvenlik algoritmasının bir kombinasyonudur. Bu algoritmalar, aşağıdaki gibi birkaç örnek verilebilir:

  • Delirium tremens: Bu algoritma, belirli veri uzunluklarında bit flip saldırılarına karşı savunma sağlar.
  • Elephant diffuser: Bu algoritma, girdi verisinin farklı bölümlerinin birbiriyle karıştırılması yoluyla hash değerinin daha güvenli hale getirilmesini sağlar.

Keccak256e, Keccak256’dan farklı olarak, Solidity dilinde daha az kullanılır. Bunun nedeni, Keccak256’nın Solidity dilinde daha yaygın kullanılması ve genellikle gereksinimlerin Keccak256’nın sunduğu özellikleri karşılamasıdır.

Diğer Keccak256 varyasyonları arasında Keccak512, Keccak384, Keccak224 ve Keccak288 gibi farklı uzunluklarda hash fonksiyonları da bulunmaktadır. Bu varyasyonlar, girdi verilerinin farklı uzunluklara sahip olduğu senaryolarda kullanılır. Örneğin, Keccak512, özellikle büyük girdi verilerinin hash’lenmesi gerektiği yerlerde kullanılır.

Örnek Solidity Kodu

1- Keccak256 kullanarak bir girdiden benzersiz bir ID oluşturma örneği:

pragma solidity ^0.8.0;

contract UniqueID {
    function generateID(string memory input) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(input));
    }
}

Bu örnekte, Solidity dilinde bir UniqueID akıllı sözleşmesi oluşturulur ve generateID fonksiyonu, bir string girdisini alır ve bu girdiden benzersiz bir bytes32 ID oluşturmak için keccak256 hash fonksiyonunu kullanır.

2- Commit-Reveal şemasını uygulamak için Keccak256 kullanarak hash değerini saklama ve açıklama örneği:

pragma solidity ^0.8.0;

contract CommitReveal {
    bytes32 public hashedValue;
    bool public isValueRevealed;

    function commit(bytes32 hash) public {
        hashedValue = hash;
        isValueRevealed = false;
    }

    function reveal(string memory value) public {
        require(!isValueRevealed, "Value already revealed.");
        require(hashedValue == keccak256(abi.encodePacked(value)), "Invalid hash value.");

        isValueRevealed = true;
    }
}

Bu örnekte, Solidity dilinde bir CommitReveal akıllı sözleşmesi oluşturulur ve commit fonksiyonu, bir bytes32 hash değerini alır ve bu hash değerini saklar. Ardından, reveal fonksiyonu, doğru gizli değer gönderilirse hash’lenmiş değeri açıklar. Bu örnek, bir bahis uygulamasında kullanılabilir.

3- Keccak256 hash’ini imzalamak için Solidity dilinde örnek kod:

pragma solidity ^0.8.0;

contract Signature {
    function sign(bytes32 messageHash, uint8 v, bytes32 r, bytes32 s) public pure returns (address) {
        bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
        address signer = ecrecover(prefixedHash, v, r, s);
        require(signer != address(0), "Invalid signature.");
        return signer;
    }
}

Bu örnekte, Solidity dilinde bir Signature akıllı sözleşmesi oluşturulur ve sign fonksiyonu, bir bytes32 mesaj hash’ini, v, r, ve s parametrelerini alır. Bu fonksiyon, önce mesaj hash’ini keccak256 fonksiyonuyla hash’ler, ardından ecrecover fonksiyonunu kullanarak bu hash değerinin imzalayanın adresini elde etmek için kullanır. Bu örnek, bir kimlik doğrulama uygulamasında veya Ethereum ağında gerçekleşen diğer türden işlemlerde kullanılabilir.

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

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

contract HashFunction {
    function hash(
        string memory _text,
        uint _num,
        address _addr
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_text, _num, _addr));
    }

    // Example of hash collision
    // Hash collision can occur when you pass more than one dynamic data type
    // to abi.encodePacked. In such case, you should use abi.encode instead.
    function collision(
        string memory _text,
        string memory _anotherText
    ) public pure returns (bytes32) {
        // encodePacked(AAA, BBB) -> AAABBB
        // encodePacked(AA, ABBB) -> AAABBB
        return keccak256(abi.encodePacked(_text, _anotherText));
    }
}

contract GuessTheMagicWord {
    bytes32 public answer =
        0x60298f78cc0b47170ba79c10aa3851d7648bd96f2f8e46a19dbc777c36fb0c00;

    // Magic word is "Solidity"
    function guess(string memory _word) public view returns (bool) {
        return keccak256(abi.encodePacked(_word)) == answer;
    }
}

Bu akıllı sözleşme iki bölümden oluşuyor. İlk bölüm “HashFunction” adlı bir sözleşmedir ve Keccak256 kullanarak bir girdiden benzersiz bir ID oluşturmak için bir fonksiyon içerir. Bu örnekte, fonksiyonun aldığı parametreler bir metin (_text), bir tamsayı (_num) ve bir adres (_addr) ‘dir. Fonksiyon, parametrelerin Keccak256 hash değerini hesaplar ve bir bytes32 türünde geri döndürür.

İkinci bölüm “GuessTheMagicWord” adlı bir sözleşmedir ve Keccak256 kullanarak bir girdinin hash değerini hesaplamak için bir fonksiyon içerir. Bu sözleşme, bir bytes32 türünde “answer” adlı bir değişken içerir ve “guess” adlı bir fonksiyonu vardır. “guess” fonksiyonu, bir metin girdisi (_word) alır, bunun Keccak256 hash değerini hesaplar ve “answer” değişkeniyle karşılaştırır. Eğer iki değer eşitse, fonksiyon “true” değerini döndürür, aksi takdirde “false” değerini döndürür.

Ayrıca, “collision” adlı bir fonksiyon da var. Bu örnek, abi.encodePacked ile birden fazla değişkeni kodlamak hash çarpışmalarına yol açabilir. Bu nedenle, “collision” fonksiyonunda abi.encode kullanımı gösterilir. Bu, birden fazla değişkeni hash etmek için daha güvenli bir yöntemdir.

Sonuç Bağlamı

Keccak256, Solidity dilinde sıkça kullanılan bir hash fonksiyonudur. Bu fonksiyon, girdinin benzersiz bir hash değerini hesaplayarak, özellikle belirli amaçlar için kullanılabilir. Örneğin, bir girdiden benzersiz bir ID oluşturmak, Commit-Reveal şemasını uygulamak ve imzalamak gibi.

Keccak256 kullanırken, encodePacked fonksiyonunu kullanarak birçok değişkeni kodlamak, hash çarpışmalarına yol açabilir. Bu nedenle, birden fazla değişkeni hash etmek için daha güvenli bir yöntem olan abi.encode fonksiyonu tercih edilmelidir.

Solidity dilinde Keccak256 kullanımı, özellikle örnek kodlar üzerinden daha iyi anlaşılabilir. Bu şekilde, farklı senaryolarda Keccak256 kullanımının nasıl gerçekleştirilebileceği anlaşılabilir ve daha güvenli kodlar yazılabilir.

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

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