menu-icon
anue logo
熱門時事鉅亨號鉅亨買幣
search icon

區塊鏈

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

BlockBeats 律動財經 2022-09-17 10:00

cover image of news article
律動財經圖片

我最近在重新學 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。

原文連結

暢行幣圈交易全攻略,專家駐群實戰交流

▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

前往鉅亨買幣找交易所優惠

文章標籤


Empty