您好,登錄后才能下訂單哦!
這篇文章主要講解了“以太坊預言機與智能合約開發(fā)方法是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“以太坊預言機與智能合約開發(fā)方法是什么”吧!
Tinypay的預言機做了三件簡單的事情:
從合同中提取'ClientCreated'事件
使用來自事件的數(shù)據(jù)驗證DNS記錄
域名確認后,向合約發(fā)送'ConfirmClient'交易
我經(jīng)歷了幾次迭代,最終實現(xiàn)了,我希望通過它們來引導您了解以太坊的發(fā)展。
我第一次寫預言機,我用了Go-Ethereum。我想直接使用RPC API與Ethereum節(jié)點進行所有通信。
這很有趣,因為我能夠?qū)W習很多關(guān)于以太坊協(xié)議如何進行存儲和數(shù)據(jù)編碼等較底層的內(nèi)容。我必須手動重新在代碼中創(chuàng)建ABI(應用程序二進制接口),并使用它來發(fā)送和解密消息。 ABI對于定義合約如何交互以及如何從線上的原始字節(jié)中提取數(shù)據(jù)是必需的。
從事件中實際提取數(shù)據(jù)證明比我想象的要復雜得多。Go-Ethereum的處理事件沒完成。我被迫手動輪詢RPC端點,并找出如何將來自原始事件的二進制數(shù)據(jù)解碼。Go-Ethereum當然似乎是以太坊團隊關(guān)注的焦點,他們應該很清楚Go-Ethereum在觀看和解碼事件方面的問題。我希望他們能很快有所提升,這會使得Go-Ethereum成為編寫預言機和其他以太坊客戶端應用程序的更好選擇。
低級別的RPC API和解碼API被證明是非常低效率的,并且他們正在更快地進行迭代,所以...
對于第二次迭代,我切換到node.js并使用web3庫與geth節(jié)點進行通信。 這給了我內(nèi)置的抽象了的事件查詢,數(shù)據(jù)提取和格式化,而且明顯使開發(fā)變得更容易。
我開始使用Alex Beregszaszi非常有用的'tinyoracle'指南,這讓我在第二版中獲得了不錯的成果
下面的代碼是經(jīng)過選擇編輯的,完整的代碼可以在github存儲庫中找到(本次迭代的標簽為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. // 這并不是嚴格需要的,但它顯示了在發(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é)點注冊過濾器,然后開始輪詢更新 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 //如果還沒有部署合約,我們在這里部署它。 if (!opts.contract_address) { // This block of code loads the ABI for interpreting contract data. // 該代碼塊加載ABI來解釋合約數(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. //在任一種情況下,啟動輪詢事件循環(huán) }
最后,在第三次迭代中,我放棄了自己搞的這一切。 我們已經(jīng)在我們的網(wǎng)絡前端使用ConsenSys的優(yōu)秀工具Truffle。 我只是將生成的構(gòu)件復制到我的node.js項目中,并直接將其包含在內(nèi),然后就開始工作。
使用Truffle,我們能夠?qū)⑽覀兊腟olidity合約編譯成的一個JavaScript庫,它可以確認各種重要的細節(jié),如合同的部署地址,并完全代替低級RPC通信。 查看事件,發(fā)送交易和查詢數(shù)據(jù)變成了直接從我們的合同中生成的簡單API調(diào)用。
// This code extract shows the whole event loop abstracted behind the actual event name: ClientConfirmed and ClientCreated. // 這段代碼顯示了整個事件循環(huán)中的抽象后的實際事件: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為使用智能合約并與之交互提供了一些非常好的抽象。
感謝各位的閱讀,以上就是“以太坊預言機與智能合約開發(fā)方法是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對以太坊預言機與智能合約開發(fā)方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。