這篇文章主要講解了“以太坊預(yù)言機(jī)與智能合約開(kāi)發(fā)方法是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“以太坊預(yù)言機(jī)與智能合約開(kāi)發(fā)方法是什么”吧!
專(zhuān)注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)向陽(yáng)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Tinypay的預(yù)言機(jī)做了三件簡(jiǎn)單的事情:
從合同中提取'ClientCreated'事件
使用來(lái)自事件的數(shù)據(jù)驗(yàn)證DNS記錄
域名確認(rèn)后,向合約發(fā)送'ConfirmClient'交易
我經(jīng)歷了幾次迭代,最終實(shí)現(xiàn)了,我希望通過(guò)它們來(lái)引導(dǎo)您了解以太坊的發(fā)展。
我第一次寫(xiě)預(yù)言機(jī),我用了Go-Ethereum。我想直接使用RPC API與Ethereum節(jié)點(diǎn)進(jìn)行所有通信。
這很有趣,因?yàn)槲夷軌驅(qū)W習(xí)很多關(guān)于以太坊協(xié)議如何進(jìn)行存儲(chǔ)和數(shù)據(jù)編碼等較底層的內(nèi)容。我必須手動(dòng)重新在代碼中創(chuàng)建ABI(應(yīng)用程序二進(jìn)制接口),并使用它來(lái)發(fā)送和解密消息。 ABI對(duì)于定義合約如何交互以及如何從線上的原始字節(jié)中提取數(shù)據(jù)是必需的。
從事件中實(shí)際提取數(shù)據(jù)證明比我想象的要復(fù)雜得多。Go-Ethereum的處理事件沒(méi)完成。我被迫手動(dòng)輪詢RPC端點(diǎn),并找出如何將來(lái)自原始事件的二進(jìn)制數(shù)據(jù)解碼。Go-Ethereum當(dāng)然似乎是以太坊團(tuán)隊(duì)關(guān)注的焦點(diǎn),他們應(yīng)該很清楚Go-Ethereum在觀看和解碼事件方面的問(wèn)題。我希望他們能很快有所提升,這會(huì)使得Go-Ethereum成為編寫(xiě)預(yù)言機(jī)和其他以太坊客戶端應(yīng)用程序的更好選擇。
低級(jí)別的RPC API和解碼API被證明是非常低效率的,并且他們正在更快地進(jìn)行迭代,所以...
對(duì)于第二次迭代,我切換到node.js并使用web3庫(kù)與geth節(jié)點(diǎn)進(jìn)行通信。 這給了我內(nèi)置的抽象了的事件查詢,數(shù)據(jù)提取和格式化,而且明顯使開(kāi)發(fā)變得更容易。
我開(kāi)始使用Alex Beregszaszi非常有用的'tinyoracle'指南,這讓我在第二版中獲得了不錯(cuò)的成果
下面的代碼是經(jīng)過(guò)選擇編輯的,完整的代碼可以在github存儲(chǔ)庫(kù)中找到(本次迭代的標(biāo)簽為v0.0.2)
var Web3 = require('web3'); var web3 = new Web3(); var contracts = require(path.join(__dirname, 'gen_contracts.json')); // First we instruct web3 to use the RPC provider //首先我們指定web3使用RPC接口 web3.setProvider( new web3.providers.HttpProvider( 'http://' + opts.rpc_host + ':' + opts.rpc_port)); // This isn't strictly necessary here, but goes to show the step // required to "unlock" the account before sending transactions. // 這并不是嚴(yán)格需要的,但它顯示了在發(fā)送交易之前“解鎖”帳戶所需的步驟。 if (!web3.personal.unlockAccount( web3.eth.coinbase, opts.wallet_password)) { console.error('Could not unlock'); process.exit(); } //Here we register the filter with the ethereum node, //and then begin polling for updates. //在這里,我們用以太坊節(jié)點(diǎn)注冊(cè)過(guò)濾器,然后開(kāi)始輪詢更新 function runLoop(o) { var filter = web3.eth.filter({address: o.contract_address}); filter.watch(function (err, results) { if (err) { console.log('WATCH ERROR: ', err); process.exit(); } console.debug(results); }); } // If the contract isn't deployed yet, we deploy it here //如果還沒(méi)有部署合約,我們?cè)谶@里部署它。 if (!opts.contract_address) { // This block of code loads the ABI for interpreting contract data. // 該代碼塊加載ABI來(lái)解釋合約數(shù)據(jù)。 var dmC = web3.eth.contract(JSON.parse(contracts.DomainMicropay.abi)); var x = { from: web3.eth.coinbase, data: contracts.DomainMicropay.bin, gas: 1000000 }; // send the transaction for installing the contract. //發(fā)送用于部署合約的交易。 dmC.new(x, function (err, resp) { if (err) { console.error('Loading contract', err); process.exit(); } var addr = resp.address; if (!addr) { console.log('Pending tx: ', resp.transactionHash); } else { console.log('Deployed Address: ', addr); opts.contract_address = addr; runLoop(opts); } }); } else { runLoop(opts); // in either case, start the polling event loop. //在任一種情況下,啟動(dòng)輪詢事件循環(huán) }
最后,在第三次迭代中,我放棄了自己搞的這一切。 我們已經(jīng)在我們的網(wǎng)絡(luò)前端使用ConsenSys的優(yōu)秀工具Truffle。 我只是將生成的構(gòu)件復(fù)制到我的node.js項(xiàng)目中,并直接將其包含在內(nèi),然后就開(kāi)始工作。
使用Truffle,我們能夠?qū)⑽覀兊腟olidity合約編譯成的一個(gè)JavaScript庫(kù),它可以確認(rèn)各種重要的細(xì)節(jié),如合同的部署地址,并完全代替低級(jí)RPC通信。 查看事件,發(fā)送交易和查詢數(shù)據(jù)變成了直接從我們的合同中生成的簡(jiǎn)單API調(diào)用。
// This code extract shows the whole event loop abstracted behind the actual event name: ClientConfirmed and ClientCreated. // 這段代碼顯示了整個(gè)事件循環(huán)中的抽象后的實(shí)際事件:ClientConfirmed 和 ClientCreated。 startWatcher: function (rpcUrl, unlockPass) { password = unlockPass || password; web3.setProvider(new web3.providers.HttpProvider(rpcUrl)); DomainMicropay.setProvider(web3.currentProvider); contract.ClientConfirmed({}, eventOpts(), function (err, data) { if (err) { console.log('Error ClientConfirmed: ', err); return; } console.log('Event ClientConfirmed: ', data.args.domain); }); contract.ClientCreated({}, eventOpts(), function (err, data) { if (err) { console.log('Error ClientCreated: ', err); return; } console.log('Event ClientCreated: ', data.args.domain); contract.getPaymentContractForDomain .call(data.args.domain) .then(beginDomainVerification(data)) .catch(errFn('Unhandled Error: ')); }); }
正如您所看到的,Truffle為使用智能合約并與之交互提供了一些非常好的抽象。
感謝各位的閱讀,以上就是“以太坊預(yù)言機(jī)與智能合約開(kāi)發(fā)方法是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)以太坊預(yù)言機(jī)與智能合約開(kāi)發(fā)方法是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前標(biāo)題:以太坊預(yù)言機(jī)與智能合約開(kāi)發(fā)方法是什么
URL網(wǎng)址:http://m.rwnh.cn/article24/psgjje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、靜態(tài)網(wǎng)站、軟件開(kāi)發(fā)、網(wǎng)站改版、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)