本篇文章給大家分享的是有關(guān)Oracle中區(qū)塊鏈的實現(xiàn)原理是什么,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站服務(wù)項目包括海門網(wǎng)站建設(shè)、海門網(wǎng)站制作、海門網(wǎng)頁制作以及海門網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,海門網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到海門省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在智能合約中執(zhí)行的邏輯不可以執(zhí)行區(qū)塊鏈之外的任何操作,例如它不可以訪問互聯(lián)網(wǎng)上的web服務(wù)。外部數(shù)據(jù)進(jìn)入智能合約的唯一方法是將其置入一個交易中,通過向系統(tǒng)發(fā)送一個新的交易來觸發(fā)區(qū)塊鏈狀態(tài)的更新。
試著考慮一下,如果智能合約在執(zhí)行時可以訪問外部的一個API來獲取數(shù)據(jù),會出現(xiàn)什么情況?
如果今天部署這個合約,那么API可能會返回如下的數(shù)據(jù):
{ "foo": "bar" }
但是明天再部署時,API可能就會返回新的數(shù)據(jù),例如:
{ "foo": "baz" }
那么可以想像,一個月以后如果有人進(jìn)行以太坊區(qū)塊鏈的同步,這個智能合約就會被執(zhí)行,但是API的響應(yīng)數(shù)據(jù)是和一個月之前不同的,這就會導(dǎo)致新同步的區(qū)塊鏈狀態(tài)不同于之前已經(jīng)存在的節(jié)點狀態(tài)。
這就不再是完全自確定的區(qū)塊鏈了。經(jīng)歷相同的同步過程,我的區(qū)塊鏈和你的區(qū)塊鏈卻不一樣!
讓我們再換個說法:給定一組區(qū)塊,一個節(jié)點必須能夠從零開始重現(xiàn)區(qū)塊鏈的最終狀態(tài),而無需互聯(lián)網(wǎng)連接。
那么這一點對于智能合約的開發(fā)者意味著什么?Oralce(預(yù)言機),開發(fā)者必須構(gòu)造一個預(yù)言機來和實現(xiàn)智能合約與外部世界的交互。
現(xiàn)在讓我們創(chuàng)建一個簡單的預(yù)言機/Oracle,來將外部的天氣數(shù)據(jù)傳入智能合約:
在最底層的區(qū)塊鏈平臺,我們需要部署一個智能合約,這個合約有一個方法updateWeather()
用來更新天氣狀態(tài),只有在合約白名單里的地址才可以調(diào)用這個方法。updateWeather方法接受天氣數(shù)據(jù)作為參數(shù),同時觸發(fā)一個以太坊合約事件并將天氣數(shù)據(jù)作為事件的參數(shù),這樣JavaScript應(yīng)用就可以訂閱這個事件并獲得異步通知了。
同時我們將創(chuàng)建兩個nodejs進(jìn)程,其中之一就是預(yù)言機/Oracle,它的實現(xiàn)邏輯就是周期性地輪詢第三方天氣API來獲取天氣數(shù)據(jù),然后將天氣數(shù)據(jù)提交給智能合約以便進(jìn)行歷史審計。
另一個nodejs進(jìn)程則負(fù)責(zé)訂閱智能合約的天氣事件,然后在控制臺輸出事件參數(shù)。正如之前所述,每當(dāng)預(yù)言機/Oracle調(diào)用合約的updateWeather()方法時,都會觸發(fā)天氣事件。
需要指出的是,為了便于理解預(yù)言機的核心實現(xiàn)思路,下面的代碼進(jìn)行了簡化,剔除了必要的錯誤處理,因此并不適用于生產(chǎn)環(huán)境。
源代碼在這里:
預(yù)言機合約 - https://github.com/decentorganization/weather-oracle-contract
預(yù)言機服務(wù) - https://github.com/decentorganization/weather-oracle-service
接下來我們詳細(xì)講解這個簡單的預(yù)言機的實現(xiàn)。
智能合約有一個公開的oracleAddress狀態(tài)變量,用來表示允許調(diào)用智能合約的updateWeather 方法的賬戶地址,我們在構(gòu)造函數(shù)中對其進(jìn)行賦值:
contract WeatherOracle {
address public oracleAddress;
constructor (address _oracleAddress) public {
oracleAddress = _oracleAddress;
}
// ...
}
接下來我們要定義天氣事件,這個事件將在weatherUpdate()調(diào)用成功時觸發(fā)。同樣為了簡化,我們讓這個事件簡單的附帶一個表示溫度的字符串參數(shù)。
event WeatherUpdate (string temperature);
最后我們要實現(xiàn)updateWeather()方法。它的可見性為public,意思是可以從外部調(diào)用這個方法:
function updateWeather (string temperature) public {
require(msg.sender == oracleAddress);
emit WeatherUpdate (temperature);
}
請注意require語句。只有當(dāng)調(diào)用地址(msg.sender)和白名單地址(oracleAddress)一致時才允許繼續(xù)執(zhí)行該方法,否則將回滾交易。
好了,就這么簡單。
我們的預(yù)言機就是一個簡單的nodejs服務(wù)。它使用request庫來調(diào)用外部天氣API,解析API的響應(yīng),然后構(gòu)造并提交交易給智能合約,然后等一會兒,重復(fù)上面的工作,如此周而復(fù)始。
讓我們從訪問API開始,我們將API的地址放在一個環(huán)境變量里,以便在開發(fā)/生產(chǎn)環(huán)境切換時避免修改源代碼:
const options = { uri: process.env.WEATHER_URL, json: true };
const start = () => {
request(options)
.then(parseData)
.then(updateWeather)
.then(restart)
.catch(error);
};
下面的代碼用來解析API的響應(yīng)結(jié)果:
const parseData = (body) => {
return new Promise((resolve, reject) => {
const temperature = body.main.temp.toString();
resolve({ temperature });
});
};
現(xiàn)在要做的就是構(gòu)造一個調(diào)用智能合約的updateWeather()
方法的以太坊交易。注意account()
是一個異步方法,它的作用是載入一個以太坊賬戶,contract
是一個js對象,它包含了之前部署的WeatherOracle智能合約的部署地址和ABI接口數(shù)據(jù)。這些與智能合約相關(guān)的函數(shù)都來自于著名的web3開發(fā)包:)
const updateWeather = ({ temperature }) => {
return new Promise((resolve, reject) => {
account().then(account => {
contract.updateWeather(temperature, { from: account }, (err, res) => {
resolve(res);
});
});
});
};
最后,我們只需要在指定超時后重新啟動這個過程即可。 wait()
函數(shù)將在指定的超時時間之后解析。
const restart = () => {
wait(process.env.TIMEOUT).then(start);
};
搞定了!上面的代碼實現(xiàn)了一個簡單服務(wù),它可以從API獲取數(shù)據(jù),然后再輸入智能合約。
注意:
當(dāng)我們構(gòu)造以太坊交易時,我們使用{from:account}
來指定調(diào)用賬戶,account
所指向的這個賬戶需要有一些以太幣來支付交易的手續(xù)費。
我們使用環(huán)境變量來配置一個私鑰,用來實例化account對象。這個私鑰必須是用來部署 WeatherOracle智能合約時傳入的那個白名單地址所對應(yīng)的私鑰。
這是另一個簡單的nodejs服務(wù)。同樣,contract
是一個包含了合約的部署地址和ABI信息的js對象,調(diào)用WeatherUpdate
并傳入一個回調(diào)就是我們訂閱天氣事件的所有代碼:
const consume = () => {
contract.WeatherUpdate((error, result) => {
console.log("NEW WEATHER DATA EVENT ON SMART CONTRACT");
console.log("BLOCK NUMBER: ");
console.log(" " + result.blockNumber)
console.log("WEATHER DATA: ");
console.log(result.args);
console.log("\n");
});
}
當(dāng)這個服務(wù)運行時,隨著交易成功入塊上鏈,它將會周期性地向控制臺輸出數(shù)據(jù):
NEW WEATHER DATA EVENT ON SMART CONTRACT
BLOCK NUMBER:
3424586
WEATHER DATA:
{ temperature: '74.75' }
以上就是Oracle中區(qū)塊鏈的實現(xiàn)原理是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前標(biāo)題:Oracle中區(qū)塊鏈的實現(xiàn)原理是什么
網(wǎng)站路徑:http://aaarwkj.com/article2/jjggoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、、App設(shè)計、做網(wǎng)站、搜索引擎優(yōu)化、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)