摘要:對(duì)于來(lái)說(shuō)通過(guò)復(fù)雜的算法生成隨機(jī)數(shù)成本太高,同時(shí)智能合約又運(yùn)行在多個(gè)節(jié)點(diǎn)上,因此,不能使用像時(shí)鐘時(shí)間來(lái)生成隨機(jī)數(shù)。在獲得隨機(jī)數(shù)之后,針對(duì)隨機(jī)數(shù)取值范圍進(jìn)行取模操作,獲得最終的隨機(jī)數(shù)。
Solidity隨機(jī)數(shù)生成
在以太坊的只能合約中,沒(méi)有提供像其他面向?qū)ο缶幊桃粯拥纳呻S機(jī)數(shù)的工具類或方法。其實(shí),所謂的隨機(jī)數(shù)也是偽隨機(jī)的,沒(méi)有哪一種語(yǔ)言能夠真正的生成隨機(jī)數(shù)。
對(duì)于solidity來(lái)說(shuō)通過(guò)復(fù)雜的算法生成隨機(jī)數(shù)成本太高,同時(shí)智能合約又運(yùn)行在多個(gè)節(jié)點(diǎn)上,因此,不能使用像時(shí)鐘時(shí)間來(lái)生成隨機(jī)數(shù)。
solidity隨機(jī)數(shù)生成過(guò)程在此使用最常用的算法之一是“線性同余發(fā)生器”(LCG)。基本步驟如下:
接收輸入
基于輸入執(zhí)行算法
取輸出模數(shù)(除以需要范圍內(nèi)的最大數(shù)量)。
function rand(uint256 _length) public view returns(uint256) { uint256 random = uint256(keccak256(abi.encodePacked(block.difficulty, now))); return random%_length; }
比如上面的代碼,通過(guò)一系列算法獲得類型為uint256的random數(shù)據(jù),然后對(duì)random取模指定的長(zhǎng)度,即可得到一個(gè)隨機(jī)數(shù)。其中_length的參數(shù)為你想去隨機(jī)數(shù)的范圍,比如要取0-10的隨機(jī)數(shù),那么_length的長(zhǎng)度便為10。
在以上方法中第一步通過(guò)abi.encodePacked(...) returns (bytes)用來(lái)計(jì)算參數(shù)的緊密打包編碼。然后通過(guò)keccak256算法對(duì)其結(jié)果進(jìn)行hash計(jì)算,最后轉(zhuǎn)換成uint256的類型。在獲得隨機(jī)數(shù)之后,針對(duì)隨機(jī)數(shù)取值范圍進(jìn)行取模操作,獲得最終的隨機(jī)數(shù)。
需要注意的是在solidity ^0.4.0版本中還可以直接使用keccak256對(duì)多個(gè)參數(shù)進(jìn)行加密,但在0.5.10版本中keccak256只能提供一個(gè)參數(shù)。所以要使用abi.encodePacked進(jìn)行處理。
原文鏈接:https://www.choupangxia.com/2...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/75747.html
摘要:今天,我們繼續(xù)介紹文獻(xiàn)中提到的以太坊合約的安全性弱點(diǎn)與案例。隨機(jī)數(shù)生成的字節(jié)碼執(zhí)行是確定性的。但是,一個(gè)惡意的礦工可能嘗試操縱自己生成的區(qū)塊來(lái)影響隨機(jī)數(shù)的生成與合約的執(zhí)行結(jié)果。合約中的錢將被偷走。 今天,我們繼續(xù)介紹文獻(xiàn)中提到的以太坊合約的安全性弱點(diǎn)與案例。 數(shù)據(jù)保密Solidity 智能合約中的變量分 public 和 private 兩種。Private 變量表示這個(gè)數(shù)值不能被其他...
摘要:郵件列表以太坊上的開發(fā)者郵件列表停止使用。開發(fā)的移動(dòng)以太坊瀏覽器開發(fā)階段由支持的瀏覽器內(nèi)。是以太坊的開發(fā)環(huán)境,測(cè)試框架和資產(chǎn)管道。審查隨機(jī)數(shù)以太坊虛擬機(jī)是以太坊智能合約的執(zhí)行環(huán)境。 去中心化應(yīng)用去中心化應(yīng)用是可以使用戶和供應(yīng)商之間直接互動(dòng)的服務(wù)(例如,連接某些市場(chǎng)上的買方和賣方,文件存儲(chǔ)里的持有者和儲(chǔ)存者)。以太坊去中心化應(yīng)用典型地通過(guò)HTML/Javascript網(wǎng)絡(luò)應(yīng)用與用戶互動(dòng),...
摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計(jì)十分靈活,極具適應(yīng)性。超級(jí)賬本區(qū)塊鏈的商業(yè)應(yīng)用超級(jí)賬本超級(jí)賬本是基金會(huì)下的眾多項(xiàng)目中的一個(gè)。證書頒發(fā)機(jī)構(gòu)負(fù)責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個(gè)故事告訴你比特幣的原理及運(yùn)作機(jī)制 這篇文章的定位會(huì)比較科普,盡量用類比的方法將比特幣的基本原理講出來(lái)...
摘要:可以把賬戶視為銀行賬戶,以太幣就是以太坊生態(tài)系統(tǒng)中的貨幣。重點(diǎn)合約狀態(tài)是持久化到區(qū)塊鏈上的,因此對(duì)合約狀態(tài)的修改需要消耗以太幣。也就是說(shuō)它們被寫入以太幣區(qū)塊鏈中想象成寫入一個(gè)數(shù)據(jù)庫(kù)。注中,實(shí)際上是代名詞,一個(gè)位的無(wú)符號(hào)整數(shù)。建立一個(gè)命名為。 區(qū)塊鏈火熱,作為程序猿的我,當(dāng)然也不能袖手旁觀,一位資深技術(shù)開發(fā)朋友曾笑說(shuō):這是屌絲程序猿改變命運(yùn)為數(shù)不多的機(jī)會(huì)之一。所以,從今天開始,就要步入?yún)^(qū)...
摘要:使用基于以太坊的智能合約的集成開發(fā)環(huán)境。以太坊教程,主要介紹智能合約與應(yīng)用開發(fā),適合入門。以太坊,主要是介紹使用進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建交易轉(zhuǎn)賬代幣開發(fā)以及過(guò)濾器和事件等內(nèi)容。 Solidity是一種以智能合約為導(dǎo)向的編程語(yǔ)言。這是一種只有四年的年輕語(yǔ)言,旨在幫助開發(fā)基于以太坊數(shù)字貨幣的智能合約。 理解它官方文檔應(yīng)該是學(xué)習(xí)Solidity的最佳來(lái)源:solidity.read...
閱讀 1672·2021-11-12 10:35
閱讀 1618·2021-08-03 14:02
閱讀 2688·2019-08-30 15:55
閱讀 2028·2019-08-30 15:54
閱讀 762·2019-08-30 14:01
閱讀 2430·2019-08-29 17:07
閱讀 2254·2019-08-26 18:37
閱讀 3034·2019-08-26 16:51