Solidity
從舊版本轉換 keccak:pragma solidity 0.4.19;
我正在嘗試編譯以下程式碼:
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
。這可能會節省一點氣體或更具可讀性。