溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

以太坊預言機與智能合約開發(fā)方法是什么

發(fā)布時間:2021-12-29 14:19:34 來源:億速云 閱讀:124 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“以太坊預言機與智能合約開發(fā)方法是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“以太坊預言機與智能合約開發(fā)方法是什么”吧!

The Tinypay.co DNS Oracle

Tinypay的預言機做了三件簡單的事情:

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

  2. 使用來自事件的數(shù)據(jù)驗證DNS記錄

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

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

你也可以直接用RPC,不過似乎不應這么干

我第一次寫預言機,我用了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被證明是非常低效率的,并且他們正在更快地進行迭代,所以...

Web3 則是一個很好的抽象

對于第二次迭代,我切換到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)
}

Truffle 應該是你最想用的框架

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

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI