1. 程式人生 > >以太坊使用ENS自定義智慧合約的地址管理

以太坊使用ENS自定義智慧合約的地址管理

我們的目標是支援以太坊錢包和信用卡支付,以減少技術嫻熟的客戶的依賴。如果客戶決定使用信用卡付款,我們必須使用我們的錢包並代他付款。

為此,我們決定在Ruby中構建後端,並在React中使用兩個分散的前端客戶端(dApp)。我們還利用了web3,這是最成熟的庫,允許連線到以太坊節點。由於它是用JavaScript編寫的,因此我們決定在Node.js中實現AWS Lambda函式,並通過我們的後端呼叫它們。

地址問題

一旦我們想要在所有環境(開發,測試,登入,生產)中保持地址同步,就會出現問題。任何合約的新版本的每次部署都要求我們在FE客戶端和AWS Lambda函式中設定新地址,並要求我們通知所有開發人員他們應該在本地計算機上更新版本。從長遠來看,這非常令人煩惱和耗時。我們決定花一些時間來解決這個問題。

以太坊名稱服務

我們想到的第一個解決方案是使用公共ENS(以太坊名稱服務),這是智慧合約的“DNS”。與DNS類似,此服務將唯一的域名指向複雜,冗長且難以記憶的地址。一切都儲存在我們智慧合約所在的同一區塊鏈中。此外,你可以隨時更改地址,因此我們不必在應用程式的許多配置中執行此操作,而只需在ENS中執行此操作。非常棒!

但是,ENS中的域名註冊需要一些時間,你需要鎖定乙太網才能擁有它,或者註冊一個在28天后過期的.test域名。此外,你的域名不會直接指向你的地址;它指向你必須部署的解析器合約(用於自行管理所有子域)。在快速開發階段,我們希望繞過這個過程並進行某種標記和版本控制。

我們的解析器

我們決定準備一個簡化版本的解析器合約和一組幫助程式,簡化管理地址的最低限度,而不必依賴ENS。我們還提出了標記地址的可能性,例如v1,v2,test,latest,default,production等。

我們還準備了一個指令碼,你可以在geth控制檯中載入該指令碼,並使用方便的函式來配置指向地址的名稱。這些幫助程式也可以在JS程式碼中匯入。你可以在此處找到開原始碼,完整文件和示例。

合約與官方ENS標準相容,因此,最終可以註冊你的真實域並指向此解析器。

用法示例

假設我們想在Express.js中編寫一個簡單的Web伺服器,它將有兩個用於設定和獲取地址的端點。

在我們的示例中,我們使用Ganache,它允許我們部署智慧合約並在本地環境中測試我們的網路。 Mac上的安裝歸結為下載應用程式並開啟它 - 我們不需要配置任何東西。

一旦我們執行Ganache,我們就可以部署我們的解析器合約。首先,我們必須克隆儲存庫。

git clone https://github.com/tooploox/ens-tagged-resolver

下一步我們安裝一些依賴:

cd ens-tagged-resolver
npm install

我們的一個依賴是truffle,開發框架,這將幫助我們輕鬆部署我們的合約。我們為你配置了truffle以支援Ganache網路(在truffle.js檔案中),因此我們可以使用一個命令部署它:

./node_modules/.bin/truffle migrate --network ganache

我們應該看到合約地址:

PublicResolver: 0x58552b526049049430c070fcd2148c806deb5b6c

我們稍後會需要這個地址。

現在,我們可以啟動Express應用程式。讓我們為它建立一個目錄並初始化一個新的節點專案:

mkdir resolver
cd resolver
node init -y

然後我們可以使用body-parser和Web3安裝Express:

npm install express body-parser [email protected] --save

我們還可以從我們的repo下載實用程式指令碼:

curl -O https://raw.githubusercontent.com/tooploox/ens-tagged-resolver/master/tagged-resolver-utils.js

畢竟,我們可以在server.js檔案中建立我們的伺服器。

首先,我們必須匯入express和Web3庫。

const express = require("express");
const bodyParser = require("body-parser");
const Web3 = require("web3");

其次,我們需要我們的utils模組:

const { taggedResolverUtils } = require("./tagged-resolver-utils");

第三,我們將建立一個Web3例項:

web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));

埠7545是Ganache使用的預設埠,你可以根據需要在設定中更改它。

接下來,我們將建立一個utils例項,將一個Web3例項作為依賴項傳遞:

const resolver = taggedResolverUtils(web3);

現在,我們可以構建兩個端點:

const RESOLVER = "0x58552b526049049430c070fcd2148c806deb5b6c"; // The address of the deployed contract 

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get("/addresses/:domain/:tag", (req, res) => {
  const addr = resolver.getAddrForTag(RESOLVER, req.params.domain, req.params.tag);
  res.send({ addr });
});

app.post("/addresses", (req, res) => {
  const txhash = resolver.setAddrForTag(RESOLVER, req.body.domain, req.body.address, req.body.tag);
  res.send({ txhash });
});

app.listen(3000);

整個列表可在此處獲得:

const express = require("express");
const bodyParser = require("body-parser");
const Web3 = require("web3");

const { taggedResolverUtils } = require("./tagged-resolver-utils");

web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
const resolver = taggedResolverUtils(web3);

const RESOLVER = "0x43c26d5a8ac0b72f4688648f979c8d4ef27d782d"; // Address of the resolver contract

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get("/addresses/:domain/:tag", (req, res) => {
  const addr = resolver.getAddrForTag(RESOLVER, req.params.domain, req.params.tag);
  res.send({ addr });
});

// An example request to the end-point:
//
// curl -X POST \
//         http://localhost:3000/addresses \
//           -H 'content-type: application/json' \
//           -d '{
//                 "domain": "libellum.eth",
//                 "address": "0xF56547A13c8d62bCE5359C20f33bA570D864f01B",
//                 "tag": "default"
//               }'

app.post("/addresses", (req, res) => {
  const txhash = resolver.setAddrForTag(RESOLVER, req.body.domain, req.body.address, req.body.tag);
  res.send({ txhash });
});

app.listen(3000);

讓我們儲存檔案並執行伺服器:

node server.js

我們有兩個端點:

[GET] http://localhost:3000/addresses/:domain/:tag
[POST] http://localhost:3000/addresses (params: domain, address, tag)

首先,我們可以檢查libellum.eth域的地址是否具有default標記:

http://localhost:3000/addresses/libellum.eth/default

我們可以看到地址是0x00000000000000000000000000000000000000000000。這意味著它是未定義的。

我們可以通過POST請求簡單地設定它:

curl -X POST \
      http://localhost:3000/addresses \
      -H 'content-type: application/json' \
      -d '{
            "domain": "libellum.eth", 
            "address": "0xF56547A13c8d62bCE5359C20f33bA570D864f01B", 
            "tag": "default"
          }'

現在你可以重新整理瀏覽器了。瞧!地址已更改。

希望這個例子可以讓你瞭解如何在應用程式中使用解析器。

摘要

Libellum是我們的本土產品,旨在利用以太坊區塊鏈上的智慧合約。該網路的分散性使我們能夠為想要證明其有價值產品的製造商提供服務。然而,在開發階段,我們遇到了一些不便。在這裡閱讀更多關於Libellum的資訊。

當我們遵循KISS(keep it simple,stupid!)的原則時,我們寧願不要過於複雜化簡單的事情並儘可能多地節省時間。我們希望Tagged Public Resolver也能節省你的時間。讓我們知道你對此的看法以及你如何處理這些問題。

======================================================================

分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裡是原文使用ENS自定義智慧合約的地址管理