Solidity

在智能合約中創建密碼是否安全?

  • August 19, 2022

部署智能合約時,我試圖在建構子中創建密碼。

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

contract passwordContract {
bytes32 password;
address owner;

constructor(uint32 _password) {
   owner = msg.sender;
   password = keccak256(abi.encodePacked(_password,msg.sender));
}

modifier onlyOwner() {
   require(msg.sender == owner, "only owner");
   _;
}

function getPassword() external view onlyOwner returns(bytes32) {
   return password;
}


// can any one call this function, but need password in parameter.
function canCallAnyOne(bytes32 _password) public {
   require(_password == password,"wrong password");
   // do something
}
}

如上例,將密碼放在函式的參數中,這樣只有知道密碼的人才能執行函式。

我有兩個問題。

  1. 部署智能合約時,礦工能猜出密碼嗎?
  2. 我想創建一個類似上面的函式。任何人都可以建議更好的方法嗎?

絕對不安全!

正如 Foxxxey 所說,你可以在鏈下創建和保存密碼的雜湊值,並將其保存在智能合約中。但這無論如何都不好,因為Frontrunning 攻擊。當使用者使用“密碼”發送交易以訪問智能合約中的功能時,該交易將位於記憶體池中等待被探勘,攻擊者和礦工將看到密碼並能夠創建另一個更高的交易gas price比你的,所以它有更多的優先級,可能會在你之前被開采和執行。

此外,智能合約或區塊鏈中沒有什麼真正私有的東西。您可以將密碼變數聲明為:

bytes32 private password;

這不會有任何好處,因為智能合約儲存中的任何值都可以直接訪問,例如:

await web3.eth.getStorageAt(yourSmartContractAddress, indexOfTheStateVariable);

在您的情況下,由於您的password變數是第一個聲明的,因此它在儲存中的索引將為 0:

await web3.eth.getStorageAt(yourSmartContractAddress, 0);

引用自:https://ethereum.stackexchange.com/questions/133851