Solidity
在智能合約中創建密碼是否安全?
部署智能合約時,我試圖在建構子中創建密碼。
// 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 } }
如上例,將密碼放在函式的參數中,這樣只有知道密碼的人才能執行函式。
我有兩個問題。
- 部署智能合約時,礦工能猜出密碼嗎?
- 我想創建一個類似上面的函式。任何人都可以建議更好的方法嗎?
絕對不安全!
正如 Foxxxey 所說,你可以在鏈下創建和保存密碼的雜湊值,並將其保存在智能合約中。但這無論如何都不好,因為Frontrunning 攻擊。當使用者使用“密碼”發送交易以訪問智能合約中的功能時,該交易將位於記憶體池中等待被探勘,攻擊者和礦工將看到密碼並能夠創建另一個更高的交易gas price比你的,所以它有更多的優先級,可能會在你之前被開采和執行。
此外,智能合約或區塊鏈中沒有什麼真正私有的東西。您可以將密碼變數聲明為:
bytes32 private password;
這不會有任何好處,因為智能合約儲存中的任何值都可以直接訪問,例如:
await web3.eth.getStorageAt(yourSmartContractAddress, indexOfTheStateVariable);
在您的情況下,由於您的
password
變數是第一個聲明的,因此它在儲存中的索引將為 0:await web3.eth.getStorageAt(yourSmartContractAddress, 0);