案發現場
首次添加交易對、一直失敗、但是也沒提示具體的原因。到這一步就沒了、由下圖可知、也沒看到log、由此可見第一步就失敗了。
解決方案
一、添加 工廠KywFactory
添加如下
bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(KywPair).creationCode));
說明
:
在智能合約中添加bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(KywPair).creationCode));
這一行代碼的主要作用是存儲KywPair合約創建代碼的哈希值。這一做法常見于自動化做市商(AMM)類的去中心化交易所(DEX),如Uniswap或類似的項目,目的是為了在計算流動性池(liquidity pool)的地址時使用。
這里詳細解釋一下:
-
創建代碼的哈希值:
keccak256(abi.encodePacked(type(KywPair).creationCode))
這一表達式計算的是KywPair
合約創建時的完整字節碼的哈希值。在Solidity中,type(KywPair).creationCode
直接引用了KywPair
合約的創建字節碼。 -
確定性地址生成:在自動化做市協議中,流動性池的地址通常是根據特定的算法確定性生成的,這個算法通常會利用到創建代碼的哈希值。通過這種方式,只要給定相同的工廠合約地址、代幣A和代幣B的地址,就可以始終生成相同的流動性池地址。這確保了對于每一對代幣,只存在一個流動性池。
-
防止重入和攻擊:使用哈希值作為計算的一部分,有助于防止惡意行為者通過不同的創建代碼來創建看似相同的流動性池,從而繞過系統的設計意圖或實施攻擊。
-
提高效率和安全性:存儲創建代碼的哈希值而不是完整的代碼,可以提高計算效率,同時確保在生成流動性池地址時的透明度和不可篡改性。
-
簡化地址計算:在需要計算流動性池地址的場景中,可以直接使用這個預先計算好的哈希值,而不需要重新生成或查找創建代碼,從而簡化了計算過程并減少了計算成本。
總的來說,INIT_CODE_PAIR_HASH
常量在去中心化金融(DeFi)項目中起到關鍵的作用,它幫助確保了流動性池地址的一致性和安全性,同時優化了計算效率。
二、路由KywLibrary更新
// calculates the CREATE2 address for a pair without making any external callsfunction pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {(address token0, address token1) = sortTokens(tokenA, tokenB);pair = address(uint(keccak256(abi.encodePacked(hex'ff',factory,keccak256(abi.encodePacked(token0, token1)),hex'c21238f28fb49774a7b7d0671f8c4e909b72b25023105d7e07ea2507b6fa3974' // init code hash))));
把INIT_CODE_PAIR_HASH 替換這個
在Swap的智能合約中,pairFor
函數用于根據給定的工廠合約地址和兩個代幣地址生成流動性對(liquidity pair)的地址。這個生成的地址是固定的,只要輸入的參數相同,每次調用都會得到同一個結果。這種方法確保了每次創建流動性對時,如果已經存在一個具有相同代幣組合的流動性對,就不會重復創建。
hex'c21238f28fb49774a7b7d0671f8c4e909b72b25023105d7e07ea2507b6fa3974'
這個十六進制字符串代表了流動性對合約的初始化代碼的哈希值。在PancakeSwap的上下文中,這通常是PancakePair
合約的創建代碼的Keccak256哈希值。
這個哈希值在計算流動性對地址的過程中扮演著重要角色,因為它幫助確保了生成的地址與特定的工廠合約、代幣組合以及初始化代碼相對應。具體來說,它的作用是:
-
確保唯一性:由于哈希函數的性質,即使微小的變化也會導致完全不同的哈希值。因此,不同的代幣組合和初始化代碼將產生不同的流動性對地址,即使工廠合約地址相同。
-
確定性地址生成:使用哈希函數和固定的輸入參數,可以計算出一個確定性的流動性對地址。這對于避免重復創建同樣的流動性對非常關鍵。
-
安全性:哈希函數的使用增加了攻擊者預測或操縱流動性對地址的難度,從而提高了系統的安全性。
-
初始化代碼的綁定:將初始化代碼的哈希值作為輸入之一,確保了生成的流動性對地址與特定的初始化代碼緊密綁定,這樣就不可能用一個不同的初始化代碼來創建一個看似相同的流動性對。
因此,hex'c21238f28fb49774a7b7d0671f8c4e909b72b25023105d7e07ea2507b6fa3974'
的存在是為了確保流動性對地址的生成既具有確定性又具有安全性,同時與特定的初始化代碼相綁定。在實際的代碼中,這個哈希值應當是PancakePair
合約創建代碼的準確哈希值,用于生成流動性對地址。