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