Solidity

從舊版本轉換 keccak:pragma solidity 0.4.19;

  • March 25, 2020

我正在嘗試編譯以下程式碼:

pragma solidity 0.5.9;
contract test{
//https://github.com/ethereum/solidity/issues/3469

address payable owner;
mapping (address => bool) pd;
uint public sS;
function lnA(address addr) public view returns(uint n) {
       // 1 in 8 chance
       n = uint(keccak256(uint(addr), sS)[0]) % 8;

   }
}

solc keccakSyntaxerr.sol

> > keccakSyntaxerr.sol:10:18:錯誤:函式呼叫的參數計數錯誤:給出了 2 個參數,但預期為 1。此函式需要一個字節參數。使用 abi.encodePacked(…) 來獲取 0.5.0 之前的行為或使用 abi.encode(…) 來使用 ABI 編碼。 > > > n = uint(keccak256(uint(addr), sS) > > $$ 0 $$) % 8; ^———–^ keccakSyntaxerr.sol:10:13:錯誤:不允許從“bytes1”到“uint256”的顯式類型轉換。n = uint(keccak256(uint(addr), sS)$$ 0 $$) % 8; ^——————————–^ >

如何將上述語法轉換為最新的 Solidity 版本?有人請指導我。

祖爾菲。

您必須將參數轉換為bytes. abi.encodePacked(args)是一種方法。

pragma solidity 0.5.9;
contract test{
   //https://github.com/ethereum/solidity/issues/3469

   address payable owner;
   mapping (address => bool) pd;
   uint public sS;

   function lnA(address addr) public view returns(uint8 n) {
       // 1 in 8 chance
       n = uint8(keccak256(abi.encodePacked(addr, sS))[0]) % 8;
   }
}

我放棄了uint(addr),因為備註中描述的“8 分之一”目標不需要用額外的零填充地址。

作為 PSA:如果目標是隨機性,請確保您完全了解基於隨機性的遊戲的攻擊向量。這是完全可以預測的,對手可以暴力破解它以獲得預期的結果。

希望能幫助到你。

更新

1 字節步驟不會為此添加任何熵(沒有任何熵)。你可以:

// 1 in 8 chance
n = uint(keccak256(abi.encodePacked(addr, sS))) % 8;

n一個在哪裡uint。這可能會節省一點氣體或更具可讀性。

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