Solidity極簡入門|第二十八講:Hash

我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(程式設計大佬可以另找教程),每周更新 1-3 講。

所有代碼和教程開源在 github:github.com/AmazingAng/WTFSolidity

哈希函數(hash function)是一個密碼學概念,它可以將任意長度的消息轉換為一個固定長度的值,這個值也稱作哈希(hash)。 這一講,我們簡單介紹一下哈希函數及在 solidity 的應用

Hash 的性質

一個好的哈希函數應該具有以下幾個特性:

單向性:從輸入的消息到它的哈希的正向運算簡單且唯一確定,而反過來非常難,只能靠暴力枚舉。

靈敏性:輸入的消息改變一點對它的哈希改變很大。

高效性:從輸入的消息到哈希的運算高效。

均一性:每個哈希值被取到的概率應該基本相等。

抗碰撞性:弱抗碰撞性:給定一個消息 x,找到另一個消息 x’使得 hash(x) = hash(x’) 是困難的。

強抗碰撞性:找到任意 x 和 x’,使得 hash(x) = hash(x’) 是困難的。

Hash 的應用

生成數據唯一標識

加密簽名

安全加密

Keccak256

Keccak256 函數是 solidity 中最常用的哈希函數,用法非常簡單:

生成數據唯一標識

我們可以利用 keccak256 來生成一些數據的唯一標識。 比如我們有幾個不同類型的數據:uint,string,address,我們可以先用 abi.encodePacked 方法將他們打包編碼,然後再用 keccak256 來生成唯一標識:

弱抗碰撞性

我們用 keccak256 演示一下之前講到的弱抗碰撞性,即給定一個消息 x,找到另一個消息 x’使得 hash(x) = hash(x’) 是困難的。

我們給定一個消息 0xAA,試圖去找另一個消息,使得它們的哈希值相等:

大家可以試個 10 次,看看能不能幸運的碰撞上。

強抗碰撞性

我們用 keccak256 演示一下之前講到的強抗碰撞性,即找到任意不同的 x 和 x’,使得 hash(x) = hash(x’) 是困難的。

我們構造一個函數 strong,接收兩個不同的 string 參數 string1 和 string2,然後判斷它們的哈希是否相同:

大家可以試個 10 次,看看能不能幸運的碰撞上。

總結

這一講,我們介紹了什麼是哈希函數,以及如何使用 solidity 最常用的哈希函數 keccak256。

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 留言
  • 轉發
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate App
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)