中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

以太坊預(yù)言機(jī)與智能合約開(kāi)發(fā)方法是什么

這篇文章主要講解了“以太坊預(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)變。

The Tinypay.co DNS Oracle

Tinypay的預(yù)言機(jī)做了三件簡(jiǎn)單的事情:

  1. 從合同中提取'ClientCreated'事件

  2. 使用來(lái)自事件的數(shù)據(jù)驗(yàn)證DNS記錄

  3. 域名確認(rèn)后,向合約發(fā)送'ConfirmClient'交易

我經(jīng)歷了幾次迭代,最終實(shí)現(xiàn)了,我希望通過(guò)它們來(lái)引導(dǎo)您了解以太坊的發(fā)展。

你也可以直接用RPC,不過(guò)似乎不應(yīng)這么干

我第一次寫(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)行迭代,所以...

Web3 則是一個(gè)很好的抽象

對(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)
}

Truffle 應(yīng)該是你最想用的框架

最后,在第三次迭代中,我放棄了自己搞的這一切。 我們已經(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)

外貿(mào)網(wǎng)站制作
水富县| 海宁市| 游戏| 郁南县| 鄂托克前旗| 烟台市| 津南区| 丰宁| 常山县| 兰溪市| 陆良县| 惠来县| 江陵县| 昌黎县| 双流县| 甘泉县| 手游| 凭祥市| 吴旗县| 遂溪县| 神木县| 辰溪县| 平乡县| 龙门县| 高邑县| 丰都县| 达日县| 阿克陶县| 高雄市| 河津市| 道孚县| 南靖县| 遂宁市| 诸城市| 巴南区| 大兴区| 南靖县| 涟源市| 稻城县| 勃利县| 贵港市|