ã€ãŒãµãªã¢ã ã¯ãåæã³ã€ã³æäŸïŒICOïŒãã©ãããã©ãŒã ãšããŠéåžžã«äººæ°ããããŸãã ãã ããERC20ããŒã¯ã³ã ãã§ãªã䜿çšãããŸãã ã«ãŒã¬ãããå®ãããã«ãŒãã²ãŒã -ãããã¯ãã¹ãŠãã€ãŒãµãªã¢ã ãããã¯ãã§ãŒã³ã«å®è£ ã§ããŸãã ä»ã®å®è£ ãšåæ§ã«ãã€ãŒãµãªã¢ã ãããã¯ãã§ãŒã³ã¯åœç©ã§ã¯ãªããåæ£åã§ééçã§ãã Ethereumã§ã¯ããã¥ãŒãªã³ã°å®å šãªããã°ã©ã ãå®è¡ã§ããŸããããã°ã©ã ã¯éåžžãããã°ã©ãã³ã°èšèªSolidityã§äœæãããŠããŸãã ãã©ãããã©ãŒã ã®åµèšè ã«ãããšãããã¯ã·ã¹ãã ããã°ããŒãã«ãªã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒãã«å€ããŸãã ãããã®ç¹æ§ã¯ããŠãŒã¶ãŒã®ä¿¡é Œãç¹ã«éèŠãªã®ã£ã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§åœ¹ç«ã¡ãŸãã
ã€ãŒãµãªã¢ã ãããã¯ãã§ãŒã³ã¯æ±ºå®è«çã§ãããããã®ã£ã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®äžå¯æ¬ ãªéšåã§ããç䌌乱æ°ãžã§ãã¬ãŒã¿ãŒïŒPRNGïŒãäœæããéã«ç¹å®ã®å°é£ãçããŸãã Solidityã§ã®PRNGã®å®å šæ§ãè©äŸ¡ããè匱æ§ãšPRNGã®å°æ¥ã®ç¶æ ãäºæž¬ããæ©èœã«ã€ãªããç¹åŸŽçãªèšèšãšã©ãŒã匷調ããããã«ãã¹ããŒãã³ã³ãã©ã¯ãã調æ»ããããšã«ããŸããã
ç§ãã¡ã®ç 究ã¯ããã€ãã®æ®µéã§å®æœãããŸããã
- 3649ã¹ããŒãã³ã³ãã©ã¯ãã«é¢ããæ å ±ã¯ãetherscan.ioããã³GitHubã§åéãããŠããŸãã
- å¥çŽã¯ç¡æã®Elasticsearchæ€çŽ¢ãšã³ãžã³ã«ã€ã³ããŒããããŸããã
- æ©èœçãªæ€çŽ¢ãšãã£ã«ã¿ãªã³ã°ã«Kibana Webã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšãããšãPRNGã®72ã®ãŠããŒã¯ãªå®è£ ãèŠã€ãããŸããã
- æåè©äŸ¡ã®åŸã43ã®ã¹ããŒãã³ã³ãã©ã¯ããè匱ã§ãããšèªèãããŸããã
è匱ãªã¢ããªã±ãŒã·ã§ã³
åæã«ãããè匱ãªPRNGã®4ã€ã®ã«ããŽãªãç¹å®ãããŸããã
- ãšã³ããããŒã®ãœãŒã¹ãšããŠãããã¯å€æ°ã䜿çšããPRNGã
- 以åã®ãããã¯ã®ããã·ã¥ã«åºã¥ãPRNGã
- çãããç§å¯ã®ã·ãŒããšçµã¿åãããåã®ãããã¯ã®ããã·ã¥ã«åºã¥ãPRNGã
- ãã©ã³ã¶ã¯ã·ã§ã³ã¢ãããã®è匱æ§ïŒããã³ãã©ã³ãã³ã°ïŒã«å¯ŸããŠè匱ãªPRNGã
åã«ããŽãªã®è匱ãªã³ãŒãã®äŸãèŠãŠã¿ãŸãããã
å¯å€ã°ã«ãŒãã䜿çšããPRNG
ãšã³ããããŒã®ãœãŒã¹ãšééãããããã€ãã®ãããã¯å€æ°ã¯æ¬¡ã®ãšããã§ãã
-
block.coinbase
çŸåšã®ãããã¯ãèŠã€ããé±å€«ã®äœæã -
block.difficulty
çŸåšã®ãããã¯ããã€ãã³ã°ãããšãã®è€éãã®çžå¯Ÿçãªææšã -
block.gaslimit
ãããã¯å ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æ倧ã¬ã¹æ¶è²»éã -
block.number
çŸåšã®ãããã¯ã®é«ãã -
block.timestamp
ãããã¯ãèŠã€ãã£ããšãã®ã¿ã€ã ã¹ã¿ã³ãã
ãŸã第äžã«ãé±å€«ã¯ãããã¯ã®ãã¹ãŠã®å€æ°ãæäœã§ããããããã®çç±ã ãã§ã¯ãšã³ããããŒã®ãœãŒã¹ãšããŠäœ¿çšã§ããŸããã ããã«éèŠãªããšã¯ããããã¯å€æ°ããããã¯å ã§æããã«åãã§ããããšã§ãã ãããã£ãŠãæ»æè ã®å¥çŽãå éšã¡ãã»ãŒãžãéããŠè¢«å®³è ã®å¥çŽãåç §ããŠããå Žåãäž¡æ¹ã®å¥çŽã§åãPRNãåãçµæãçæããŸãã
äŸ1ïŒ 0x80ddae5251047d6ceb29765f38fed1c0013004b7 ïŒïŒ
// Won if block number is even // (note: this is a terrible source of randomness, please don't use this with real money) bool won = (block.number % 2) == 0;
äŸ2ïŒ 0xa11e4ed59dc94e69612f3111942626ed513cb172 ïŒïŒ
// Compute some *almost random* value for selecting winner from current transaction. var random = uint(sha3(block.timestamp)) % 2;
äŸ3ïŒ 0xcC88937F325d1C6B97da0AFDbb4cA542EFA70870 ïŒïŒ
address seed1 = contestants[uint(block.coinbase) % totalTickets].addr; address seed2 = contestants[uint(msg.sender) % totalTickets].addr; uint seed3 = block.difficulty; bytes32 randHash = keccak256(seed1, seed2, seed3); uint winningNumber = uint(randHash) % totalTickets; address winningAddress = contestants[winningNumber].addr;
ãããã¯ããã·ã¥ã®PRNG
Ethereumãã§ãŒã³ã®åãããã¯ã«ã¯æ€èšŒããã·ã¥ããããŸãã Ethereum Virtual MachineïŒEVMïŒã§ã¯ã
block.blockhash()
é¢æ°ã䜿çšããŠãããã®ããã·ã¥ãååŸã§ããŸãã ãã®é¢æ°ã¯ããããã¯çªå·ã瀺ãæ°å€åŒæ°ãåãåããŸãã ãã®èª¿æ»ã®éçšã§ã
block.blockhash()
é¢æ°ã®å®è¡çµæã¯ã
block.blockhash()
å®è£ ã§ãã°ãã°èª€ã£ãŠäœ¿çšãããããšã
block.blockhash()
ã
ãã®ãããªè匱ãªPRNGã«ã¯ãäž»ã«3ã€ã®çš®é¡ããããŸãã
-
block.blockhash(block.number)
ãçŸåšã®ãããã¯ã®ããã·ã¥ã -
block.blockhash(block.number - 1)
ãæåŸã®ãããã¯ã®ããã·ã¥ã -
block.blockhash()
ãçŸåšã®ãããã¯ããå°ãªããšã256ãããã¯é¢ãããããã¯ã®ããã·ã¥ã
ãããã®åã±ãŒã¹ãèŠãŠã¿ãŸãããã
block.blockhashïŒblock.numberïŒ
ç¶æ å€æ°
block.number
䜿çšãããšãçŸåšã®ãããã¯ã®é«ããç¥ãããšãã§ããŸãã ãã€ããŒãå¥çŽã³ãŒããå®è¡ãããã©ã³ã¶ã¯ã·ã§ã³ãéžæãããšããã®ãã©ã³ã¶ã¯ã·ã§ã³ãå«ãå°æ¥ã®ãããã¯ã®
block.number
å€æ°ãããã£ãŠãããããå¥çŽã¯ç¢ºå®ã«ãã®å€ãååŸã§ããŸãã ãã ããEVMã§ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æç¹ã§ã¯ãäœæäžã®ãããã¯ã®ããã·ã¥ã¯æãããªçç±ã§ãŸã ããã£ãŠããããEVMã¯åžžã«ãŒããè¿ããŸãã
äžéšã®ã³ã³ãã©ã¯ãã¯ãåŒ
block.blockhash(block.number)
誀ã£ãŠè§£éããŸãã ãããã®ã³ã³ãã©ã¯ãã§ã¯ãçŸåšã®ãããã¯ã®ããã·ã¥ã¯å®è¡æã«æ¢ç¥ã§ãããšèŠãªããããšã³ããããŒã®ãœãŒã¹ãšããŠäœ¿çšãããŸãã
äŸ1ïŒ 0xa65d59708838581520511d98fb8b5d1f76a96cad ïŒïŒ
function deal(address player, uint8 cardNumber) internal returns (uint8) { uint b = block.number; uint timestamp = block.timestamp; return uint8(uint256(keccak256(block.blockhash(b), player, cardNumber, timestamp)) % 52); }
äŸ2ïŒ https://github.com/axiomzen/eth-random/issues/3 ïŒïŒ
function random(uint64 upper) public returns (uint64 randomNumber) { _seed = uint64(sha3(sha3(block.blockhash(block.number), _seed), now)); return _seed % upper; }
block.blockhashïŒblock.number-1ïŒ
äžéšã®ã³ã³ãã©ã¯ãã¯ããããã¯ããã·ã¥ã«åºã¥ããŠç°ãªãããŒãžã§ã³ã®PRNGã䜿çšããŸããçŸåšã®ãããã¯ã§ã¯ãªããçŸåšã®ãããã¯ã®ããã·ã¥ãååŸãããŸãã èšããŸã§ããªãããã®ã¢ãããŒããåãå ¥ããããŸãããæ»æè ã¯åãPRSPã³ãŒãã§ãšã¯ã¹ããã€ãã³ã³ãã©ã¯ããäœæããå éšã¡ãã»ãŒãžãä»ããŠã¿ãŒã²ããã³ã³ãã©ã¯ããåŒã³åºãããšãã§ããŸãã äž¡æ¹ã®å¥çŽã«åããã©ã³ãã ãªãçªå·ãä»ããããŸãã
äŸ1ïŒ 0xF767fCA8e65d03fE16D4e38810feller376c3372A8 ïŒïŒ
//Generate random number between 0 & max uint256 constant private FACTOR = 1157920892373161954235709850086879078532699846656405640394575840079131296399; function rand(uint max) constant private returns (uint256 result){ uint256 factor = FACTOR * 100 / max; uint256 lastBlockNumber = block.number - 1; uint256 hashVal = uint256(block.blockhash(lastBlockNumber)); return uint256((uint256(hashVal) / factor)) % max; }
æªæ¥ã®ãããã¯ã®ããã·ã¥
ããè¯ãã¢ã€ãã¢ã¯ãå°æ¥ã®ãããã¯ã®ããã·ã¥ã䜿çšããããšã§ãã ãã®ã·ããªãªã¯æ¬¡ã®ããã«å®è£ ã§ããŸãã
- ãã¬ãŒã€ãŒã¯è³ãããããªãã£ã¹
block.number
ååŒã®block.number
ä¿åããŸãã - å¥çŽãå床åŒã³åºããšãããã¬ãŒã€ãŒã¯å±ã«åã£ãçªå·ãçºè¡šããããã«é Œã¿ãŸãã
- ãªãã£ã¹ã¯ãã¹ãã¢ããä¿åããã
block.number
ãååŸãããã®ããã·ã¥ãåä¿¡ããŸãããã®ããã·ã¥ã¯ãæ¬äŒŒä¹±æ°ã®çæã«äœ¿çšãããŸãã
ãã®ã¢ãããŒãã¯ã1ã€ã®éèŠãªèŠä»¶ãæºããããŠããå Žåã«ã®ã¿æ©èœããŸãã Solidityã®ããã¥ã¡ã³ãã¯ãEVMãä¿åã§ãããããã¯ã®ããã·ã¥ã®å¶éã«ã€ããŠèŠåããŠããŸãïŒ
ã¹ã±ãŒã©ããªãã£äžã®çç±ã«ãããããã·ã¥ã¯ãã¹ãŠã®ãããã¯ã§å©çšã§ããããã§ã¯ãããŸããã æåŸã®256ãããã¯ã®ã¿ã®ããã·ã¥ã«ã¢ã¯ã»ã¹ã§ããä»ã®ãã¹ãŠã®å€ã¯ãŒãã«ãªããŸãã
ãããã£ãŠãããã·ã¥ãã§ãã¯ä»ãã®2çªç®ã®åŒã³åºãã256ãããã¯ä»¥å ã«å°çããªãã£ãå Žåãäºåã«æ¬äŒŒä¹±æ°ãäºæž¬ã§ããŸããããã·ã¥ã¯ãŒãã«ãªããŸãã
ãã®è匱æ§ãæªçšããæãæåãªã±ãŒã¹ã¯ãSmartBillionså®ããã®ãããã³ã°ã§ãã å¥çŽã¯
block.number
ã®å¹Žéœ¢ããã§ãã¯ããŸãã
block.number
ããã®ãããäºæž¬å¯èœãªåœéžçªå·ãæããã«ããåã«ã256
block.number
ãåŸ ã€æªç¥ã®ãã¬ãŒã€ãŒã«400 ETHãè¡ããŸããã
ã·ãŒã¯ã¬ããããã·ã¥ãããã¯ããã·ã¥
ãšã³ããããŒãé«ããããã«ãäžéšã®å¥çŽã§ã¯è¿œå ã®ã·ãŒãã䜿çšããŸãããããã¯ã·ãŒã¯ã¬ãããšèŠãªãããŸãã 1ã€ã®äŸã¯Slotthereumå®ããã§ãã é¢é£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
bytes32 _a = block.blockhash(block.number - pointer); for (uint i = 31; i >= 1; i--) { if ((uint8(_a[i]) >= 48) && (uint8(_a[i]) <= 57)) { return uint8(_a[i]) - 48; } }
ãã€ã³ã¿ãŒå€æ°ã¯ç§å¯ã§ãããšå®£èšãããŠããŸããã€ãŸããä»ã®ã³ã³ãã©ã¯ãã¯ã¢ã¯ã»ã¹ã§ããŸããã åã²ãŒã ã®åŸããã®å€æ°ã«ã¯1ãã9ãŸã§ã®åå©çªå·ãå²ãåœãŠããããããã¯ããã·ã¥ãåä¿¡ãããšãã«
block.number
ããªãã»ããããããã«äœ¿çšãããŸãã
æ¬è³ªçã«éæãªãããã¯ãã§ãŒã³ã¯ãç§å¯ãã¯ãªã¢ããã¹ãã§ä¿åããããã«äœ¿çšããªãã§ãã ããã ã·ãŒã¯ã¬ããå€æ°ã¯ä»ã®ã³ã³ãã©ã¯ãããä¿è·ãããŠããŸãããã³ã³ãã©ã¯ãã¹ãã¢ã®ã³ã³ãã³ãããã§ãŒã³ããååŸã§ããŸãã ããšãã°ã人æ°ã®ããweb3 Ethereumã¯ã©ã€ã¢ã³ãã«ã¯ãç¹å®ã®ã€ã³ããã¯ã¹ã§ã¹ãã¬ãŒãžã¬ã³ãŒããååŸã§ãã
web3.eth.getStorageAt()
ãšããAPIã¡ãœããããããŸãã
ãã®äºå®ãèãããšãç§å¯ã®å€æ°ã®å€ãã³ã³ãã©ã¯ãã¹ãã¢ããæœåºãããšã¯ã¹ããã€ãã³ãŒãã®åŒæ°ãšããŠäœ¿çšããã®ã¯ç°¡åãªäœæ¥ã«ãªããŸãã
function attack(address a, uint8 n) payable { Slotthereum target = Slotthereum(a); pointer = n; uint8 win = getNumber(getBlockHash(pointer)); target.placeBet.value(msg.value)(win, win); }
ãã©ã³ã¶ã¯ã·ã§ã³ã¢ããã³ã¹
æ倧ã®å ±é ¬ãåŸãããã«ãé±å€«ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãéžæããŠãåãã©ã³ã¶ã¯ã·ã§ã³ã«è²»ããããç·ã¬ã¹ïŒçæïŒã«åºã¥ããŠæ°ãããããã¯ãäœæããŸãã ãããã¯å ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®é åºã¯ãã¬ã¹ã®äŸ¡æ Œã«ãã£ãŠæ±ºãŸããŸãã æ倧ã¬ã¹äŸ¡æ Œã®ååŒãæåã«å®è¡ãããŸãã ãã®ãããã¬ã¹ã®äŸ¡æ Œãå€æŽããããšã«ãããçŸåšã®ãããã¯ã®ä»ã®ãã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ãããæ©ãç®çã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããããšãã§ããŸãã ããã¯ãã»ãã¥ãªãã£ã®åé¡ã«ãªãå¯èœæ§ããããŸããéåžžãã³ã³ãã©ã¯ãã®å®è¡ããããã¯å ã®ããžã·ã§ã³ã«äŸåããå Žåãããã³ãã©ã³ãã³ã°ãšåŒã°ããŸãã
次ã®äŸãèããŠã¿ãŸãããã å®ããã¯ãå€éšãªã©ã¯ã«ã䜿çšããŠæ¬äŒŒä¹±æ°ãååŸããŸããããã¯ãçŸåšã®ã©ãŠã³ãã§è³ãããããã¬ãŒã€ãŒã®äžããåè ãéžæããããã«äœ¿çšãããŸãã ãããã®çªå·ã¯ã¯ãªã¢ããã¹ãã§éä¿¡ãããŸãã æ»æè ã¯ä¿çäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ã芳å¯ã§ããOracleããã®çªå·ãåŸ æ©ããŠããŸãã ãªã©ã¯ã«ããã®ãã©ã³ã¶ã¯ã·ã§ã³ããã©ã³ã¶ã¯ã·ã§ã³ããŒã«ã«è¡šç€ºããããšããã«ãæ»æè ã¯ããé«ãã¬ã¹äŸ¡æ Œã§å ¥æããŸãã æ»æè ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯çŸåšã®ã©ãŠã³ãã§æåŸã«æ¥ãŸããããã¬ã¹äŸ¡æ Œãæãé«ããããå®éã«ã¯ãªã©ã¯ã«ãã©ã³ã¶ã¯ã·ã§ã³ãããæ©ãå®è¡ããããã¬ã€ã€ãŒã«åå©ããããããŸãã ãã®ã¿ã¹ã¯ã¯ã ããã«ãŒã³ã³ãã¹ãZeroNights ICOã®åå è ã«ãã£ãŠå®è¡ãããŸããã
ãã©ã³ã¶ã¯ã·ã§ã³ãçºçããããå¥çŽã®ãã1ã€ã®äŸã¯ã Last is meïŒãšããã²ãŒã ã§ãã ãã¬ã€ã€ãŒããã±ãããè³Œå ¥ãããã³ã«ã圌ã¯æåŸã®å Žæãåããã¿ã€ããŒã¯ã«ãŠã³ãããŠã³ãéå§ããŸãã ç¹å®ã®ãããã¯æ°ã®ãã±ããã誰ãè³Œå ¥ããªãå ŽåãæåŸã®ãå Žæãåã£ãŠããããã¬ã€ã€ãŒããžã£ãã¯ããããç²åŸããŸãã ã©ãŠã³ããå®äºã«è¿ã¥ããšãæ»æè ã¯ä»ã®åå è ã®ãã©ã³ã¶ã¯ã·ã§ã³ããŒã«ã芳å¯ãããžã£ãã¯ããããå²ãåœãŠãŠãããé«ãã¬ã¹äŸ¡æ Œãèšå®ã§ããŸãã
ããå®å šãªPRNG
Ethereumãããã¯ãã§ãŒã³ã§ããå®å šãªPRNGãå®è£ ããã«ã¯ãããã€ãã®ã¢ãããŒãããããŸãã
- å€éšãªã©ã¯ã«
- èšå·
- ã³ãããé瀺ã¹ããŒã
å€éšã®ç¥èšïŒOraclize
Oraclizeã¯ããããã¯ãã§ãŒã³ãšå€éšç°å¢ïŒã€ã³ã¿ãŒãããïŒã®éã®ããªããžã確ç«ããåæ£ã¢ããªã±ãŒã·ã§ã³çšã®ãµãŒãã¹ã§ãã Oraclizeã䜿çšããå Žåãã¹ããŒãã³ã³ãã©ã¯ãã¯çºæ¿ã¬ãŒãã倩æ°äºå ±ãæ ªäŸ¡æ å ±ãªã©ã®ããŒã¿ãWebäžã®APIãããªã¯ãšã¹ãã§ããŸãã æãããç¥ãããŠãã䜿çšäŸã®1ã€ã¯ãPRNGãšããŠæ©èœããOraclizeã®æ©èœã§ãã äœæ¥äžã«åæãããå¥çŽã®äžã«ã¯ãOraclizeã䜿çšããŠãURLã³ãã¯ã¿ãä»ããŠrandom.orgããä¹±æ°ãååŸãããã®ããããŸããã ãã®å³ãå³ã«ç€ºããŸãã 1ã
å³ 1.ã¯ãŒã¯ãããŒã®æŽç
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯éäžåã§ãã OraclizeããŒã¢ã³ãçµæã«å¹²æžããªããšä¿¡ããããŸããïŒ random.orgãšãã®ãµãŒãã¹ã®åºç€ãšãªãã€ã³ãã©ã¹ãã©ã¯ãã£å šäœãä¿¡é Œã§ããŸããïŒ Oraclizeã¯TLSNotaryç£æ»ãµãŒãã¹ãä»ããŠçµæããã§ãã¯ããŸããããããã¯ãã§ãŒã³ã®å€éšã§ã®ã¿äœ¿çšã§ããŸããå®ããã®å Žåã¯ãåè ã®çºè¡šåŸã«ã®ã¿äœ¿çšã§ããŸãã ãã§ãŒã³å ã§æ€èšŒå¯èœãªå 垳蚌æ ã䜿çšããŠããã©ã³ãã ãããŒã¿ã®ãœãŒã¹ãšããŠOraclizeã䜿çšããããšããå§ãããŸãã
å€éšãªã©ã¯ã«ïŒBTCRelay
BTCRelayã¯ãEthereumãšBitcoinãããã¯ã®ãã§ãŒã³éã®ããªããžã§ãã BTCRelayã䜿çšããå Žåãã€ãŒãµãªã¢ã ãããã¯ãã§ãŒã³ã®ã¹ããŒãã³ã³ãã©ã¯ãã¯ãå°æ¥ã®ãããã³ã€ã³ãããã¯ã®ããã·ã¥ãèŠæ±ãããšã³ããããŒã®ãœãŒã¹ãšããŠäœ¿çšã§ããŸãã PRTCãšããŠBTCRelayã䜿çšãããããžã§ã¯ãã®1ã€ã¯ã Ethereum Lotteryã§ãã
BTCRelayã¡ãœããã¯ããã€ããŒãåºæ¿ããåé¡ããä¿è·ãããŠããŸããã ããã§ã®éå£ã¯ã€ãŒãµãªã¢ã ãããã¯ã®å Žåãããé«ãã§ããããããã³ã€ã³ã®äŸ¡æ Œãé«ãããã§ãã ãããã£ãŠããã®ã¢ãããŒãã¯ãé±å€«ã«ããè©æ¬ºã®å¯èœæ§ãäœæžããŸãããæé€ããŸããã
èšå·
Signidiceã¯ãæå·çœ²åã«åºã¥ãã¢ã«ãŽãªãºã ã§ãã ãã¬ãŒã€ãŒãšãªãã£ã¹ã®2ã€ã®ããŒãã£ãé¢äžããã¹ããŒãã³ã³ãã©ã¯ãã§PRNGãšããŠäœ¿çšã§ããŸãã ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«æ©èœããŸãã
- ãã¬ãŒã€ãŒã¯è³ããããã¹ããŒãã³ã³ãã©ã¯ããåŒã³åºããŸãã
- ãªãã£ã¹ã¯è³ããèŠãŠãç§å¯éµã§çœ²åãã眲åãã¹ããŒãã³ã³ãã©ã¯ãã«éä¿¡ããŸãã
- ã¹ããŒãã³ã³ãã©ã¯ãã¯ãæ¢ç¥ã®å ¬éããŒã䜿çšããŠçœ²åãæ€èšŒããŸãã
- 次ã«ããã®çœ²åã䜿çšããŠä¹±æ°ãçæããŸãã
Ethereumã«ã¯ããã§ãŒã³å ã®ECDSA眲åãæ€èšŒããããã®
ecrecover()
é¢æ°ããããŸãã ãã ãããªãã£ã¹ã¯å ¥åãã©ã¡ãŒã¿ãŒïŒç¹ã«kãã©ã¡ãŒã¿ãŒïŒãæäœã§ãããããçµæã®çœ²åã«åœ±é¿ãäžãããããSignidiceã§ã¯ECDSAã䜿çšã§ããŸããã Alexey Pertsev ã¯ãã®ãããªè©æ¬ºã®ãã¢ã瀺ããŸããã
幞ããªããšã«ãããŒããã©ãŒã¯Metropolisã®ãªãªãŒã¹ã«ããã ã¢ãžã¥ã©ãŒã¹ãä¹æŒç®åãç»å ŽããŸããã ããã«ãããRSA眲åã®æ€èšŒãå¯èœã«ãªããŸãã ECDSAãšã¯ç°ãªããå ¥åãã©ã¡ãŒã¿ãŒãæäœããŠé©åãªçœ²åãèŠã€ããããšã¯ã§ããŸããã
ã³ãããé瀺ã¹ããŒã
ååã瀺ãããã«ãã³ããã-å ¬éã¹ããŒã ã¯2ã€ã®ã¹ãããã§æ§æãããŸãã
- åœäºè ãæå·ã§ä¿è·ãããã·ãŒã¯ã¬ãããã¹ããŒãã³ã³ãã©ã¯ãã«éä¿¡ããã³ããã段éã
- é瀺ãã§ãŒãºã§ã¯ãåœäºè ãã¯ãªã¢ããã¹ãã§ã·ãŒãã宣èšãããšãã¹ããŒãã³ã³ãã©ã¯ãã¯ããããæ£ããããšã確èªããä¹±æ°ã®çæã«äœ¿çšãããŸãã
é©åã«å®è£ ãããã³ãããé瀺ã¹ããŒã ã¯ãçåŽã«äŸåãã¹ãã§ã¯ãããŸããã ãã¬ã€ã€ãŒã¯ææè ã«ãã£ãŠæåºãããå ã®éå§çªå·ãç¥ããã圌ãã®ãã£ã³ã¹ã¯åãã§ãããææè ã¯ãã¬ã€ã€ãŒã§ããå¯èœæ§ãããããããã¬ã€ã€ãŒã¯åœŒãä¿¡é Œã§ããŸããã
ã³ãããé瀺ã¹ããŒã ã¯ã RandaoãµãŒãã¹ã«ããé©åã«å®è£ ãããŠããŸãã PRNGã¯ãããã€ãã®é¢ä¿è ããã·ãŒãçªå·ã®ããã·ã¥ãåéãããããããåå ã«å¯ŸããŠå ±é ¬ãåãåããŸãã ä»ã®äººã®éå§çªå·ã誰ãç¥ããªããããçµæã¯å®å šã«ã©ã³ãã ã§ãã ãã ããå°ãªããšã1ã€ã®ããŒãã£ãæåã®çªå·ã®å ±åãæåŠããå ŽåããµãŒãã¹ã¯å€±æããŸãã
ã³ãããé瀺ã¹ããŒã ã¯ãå°æ¥ã®ãããã¯ã®ããã·ã¥ã䜿çšããŠçµã¿åãããããšãã§ããŸãã ãã®å Žåããšã³ããããŒã®3ã€ã®ãœãŒã¹ãé¢ä¿ããŸãã
- sha3ææè ïŒseed1ïŒ
- sha3ãã¬ãŒã€ãŒïŒseed2ïŒ
- æªæ¥ã®ãããã¯ã®ããã·ã¥
次ã«ãä¹±æ°ã次ã®ããã«çæãããŸãïŒ
sha3(seed1, seed2, blockhash)
ã ãããã£ãŠããã³ãããé瀺ãã¹ããŒã ã¯ããã€ããŒãåºæ¿ããåé¡ã解決ããŸãããã€ããŒã¯ãããã¯ããã·ã¥ã«åœ±é¿ãäžããå¯èœæ§ããããŸãããææè ãšãã¬ã€ã€ãŒã®åæçªå·ã¯ããããŸããã ãŸããææè ãåºæ¿ããåé¡ã解決ããŸããææè ã¯èªåã®åæçªå·ã®ã¿ãç¥ã£ãŠããŸããããã¬ãŒã€ãŒã®åæçªå·ãšå°æ¥ã®ãããã¯ã®ããã·ã¥ãç¥ããŸããã ãŸãããã®ãããªã¹ããŒã ã¯ãææè ãšãã€ããŒãšããŠåæã«è¡åããå Žåã«é©ããŠããŸãããããã¯ããã·ã¥ã決å®ããææè ã®åæçªå·ã¯ç¥ã£ãŠããŸããããã¬ãŒã€ãŒã®åæçªå·ã¯ããããŸããã
ãããã«
Ethereumãããã¯ãã§ãŒã³ã§ã®PRNGã®å®å šãªå®è£ ã¯æªè§£æ±ºã®ã¿ã¹ã¯ã®ãŸãŸã§ãã ç§ãã¡ã®èª¿æ»ã瀺ããããã«ãæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãäžè¶³ããŠãããããéçºè ã¯PRNGã®ç¬èªã®å®è£ ãå®è£ ããåŸåããããŸãã ãããããããã¯ãã§ãŒã³ã«ã¯ãšã³ããããŒã®åå ãã»ãšãã©ãªããããééããç¯ããããã§ãã PRNGãéçºãããšããéçºè ã¯ååŽã®åæ©ãç解ããŠããããšã確èªããŠãããé©åãªã¢ãããŒããéžæããå¿ èŠããããŸãã