2018 年 7 月

第 33 卷,第 7 期

本文章是由機器翻譯。

區塊鏈 - 去中心化的應用程式與 Azure 區塊鏈即服務

藉由Stefano Tempesta

區塊鏈來簡化商務程序、 確認交易,並降低潛在的詐欺事件擷取的商務和科技世界的注意。這篇文章介紹區塊鏈即服務 (BaaS) 在 Microsoft Azure 中,顯示如何使用它來建立受保護的資料結構,並建立分散式的交易式數位分類帳。

有很多的相關區塊鏈如何,它開始並以數位的分類帳比特幣的網際網路上的文獻內容。良好的簡介文章,以何種區塊鏈是位於bit.ly/2IsoWeJ,以及如需區塊鏈的運作方式的更多技術概觀,請參閱 Jonathan Waldman"區塊鏈基本法則 」 文章年 3 月 2018發出MSDN Magazine (msdn.com/magazine/mt845650)。

區塊鏈是安全、 共用分散式總帳,可以是公用、 私人或協會 」 (也就,限制為僅限具名成員)。這是安全的因為它會使用加密建立難以 (甚至無法以目前的運算技術) 的交易要竄改。在所有節點或對等電腦之間共用鏈結中的資料存放區,您很快就會發現,在合約的表單中的商務邏輯。區塊鏈值確實直接連結到它們參與的實體數目。嚴重的是,區塊鏈資料和合約,分散,這表示有許多複本的資料庫。並有多個複本,它變成多的驗證。而最後,區塊鏈是數位交易記錄資料庫,附加只不可變的記錄,就會發生的每筆交易的交易式資料庫。

我想要強調這點在分散式的總帳的區塊鏈。傳統總帳集中管理,並使用協力廠商系統或 middlemen,核准,並記錄交易。將信用卡、 銀行、 身分識別管理系統等。這個方法會建立一項挑戰的信任和小數位數。您信任您的中間人代理程式,做為您的交易訊息代理程式嗎?代理程式可以成為單一失敗點?可以它受到洩露嗎?

在區塊鏈,總帳會分散到整個網路,則不需要任何第三方系統處於交易中途。技術會維護多個複本的資料,如所示的對等檔案共用系統,因為每個對等取得整個資料集的複本。沒有人擁有的全部內容,但每個人都擁有一份。[圖 1說明這種排列方式。

非集中式的分散式的總帳
[圖 1] 非集中式的分散式的總帳

第一個區塊鏈,比特幣,源自於 2009 年,不同的限制。為數位交易記錄資料庫,它只會記錄交易並不會追蹤的數位資產帳戶餘額。先前的交易,下列不可變的區塊鏈中已記錄的交易記錄的連結會驗證 bitcoins 的擁有權。此外,比特幣未定義任何特定的邏輯如何處理交易和條件,比方說,這兩個相關合作對象都必須同意加密貨幣交換中。

區塊鏈技術發展加上智能合約,也就是一小段程式碼,將邏輯加入至交易。將視為商品或服務的法律條款合約中的電腦程式碼表示智能合約。新的區塊鏈總帳脫穎而出,在市場上最受歡迎的 Ethereum (ethereum.org),即可讓 Hyperledger Fabric (hyperledger.org),將智慧型合約功能新增至網路。在這些 (暫且把他們區塊鏈 2.0) 數位總帳,智能合約現在儲存在區塊,並會分散到所有的節點,以及相關的資料。

區塊鏈 3.0

比特幣的區塊鏈通常稱為 「 區塊鏈 1.0。它是簡單的交易記錄資料庫交易記錄順序中,在任何給定的時刻代表網路的狀態。將它簡稱為分散式的資料庫。

但如同資料庫已隨時間而變化藉由新增邏輯執行功能 — 在預存程序,例如表單中,區塊鏈已導入智能合約來處理邏輯層。不過,只有儲存所在的區塊中才包含的資料可以操作智能合約。無法存取外部資料,或系統,只要呼叫該區塊鏈的區塊鏈符號"thawte 和 ebay 之間 「 外部的服務提供的密碼編譯安全性和交易的不變性。CRM、 ERP 和薪資系統所有代表不是一部分的區塊鏈,但可能會參與交換的交易內資料的外部實體。區塊鏈需要安全地接收外部的資料,以及安全地執行鏈結外的程式碼存取的方法。

若要解決這項需求,Microsoft 引進了 cryptlets"區塊鏈 3.0,"的資料、 邏輯和雲端服務的區塊鏈的一部分。[圖 2顯示的功能進度。

區塊鏈的發展
[圖 2 演進而來的區塊鏈

Cryptlets 是可以安全、 隔離且受信任的容器內執行,並且可以透過安全通道進行通訊的任何語言撰寫的鏈結外的程式碼模組。Cryptlets 藉由提供服務,例如加密、 日期和時間的事件、 外部資料存取和身分識別驗證擴充智能合約與外界聯繫。Microsoft 導入了 cryptlets 其開放原始碼專案的一部分 r2、code-named"Bletchley"(bit.ly/2Iv9VZz),其中已發展成 Azure Blockchain Workbench 產品在 Microsoft Build 開發人員會議中顯示5 月。

在網站上所述,Bletchley 是建置企業協會區塊鏈生態系統的架構方法。為了釐清,這不是區塊鏈堆疊。它是 Microsoft 的方法帶入企業和建置實際的解決方案,解決真實商務問題,同時開啟的平台的分散式的總帳 (blockchain) 平台。

Azure Blockchain Workbench (aka.ms/abcworkbench) 會利用不同的區塊鏈總帳和現有的雲端服務,以啟用適用於企業的強固的區塊鏈生態系統。它是簡單易用的工具與簡化的介面,可讓使用者建立充分運用 Azure 服務,包括 Azure Active Directory (Azure AD)、 Azure 金鑰保存庫、 Azure SQL Database、 Application Insights 的端對端區塊鏈應用程式Azure Functions,以及服務匯流排。它是受歡迎的區塊鏈周圍,以及可用來建置區塊鏈為基礎的應用程式參考架構。

您可以深入了解 Azure Blockchain Workbench 我撰寫了 6 月號 MSDN magazine 》 的 「 簡介 Azure Blockchain Workbench 」 一文中 (msdn.com/magazine/mt846726)

這些回到 cryptlets,提供容易存取的方式,供開發人員使用跨領域功能,例如整合到第三方系統和資料存取。但是我焦點移至集中式應用程式的開發上的區塊鏈之前,我需要平台上公開或私人的分散式總帳提供安全且整合的解決方案。Microsoft Azure 提供全球的使用量,可讓您建置超大規模、 安全的資料和執行平台,提供新一代應用程式任何區塊鏈平台上。

Blockchain jako Služba

在 Azure 上的區塊鏈 (bit.ly/2rQUO5q) 提供快速、 低成本、 低風險的平台,用於建置及部署區塊鏈應用程式。Azure,基本上,提供區塊鏈即服務 (BaaS) 最熱門總帳,包括以太坊、 仲裁,即可讓 Hyperledger Fabric、 Corda 等提供數個容易部署、 符合企業需求的範本。

銷售與推銷,讓我們深入的 Azure 入口網站中的特定總帳組態前先調查 Azure BaaS,某些重要功能。Azure 區塊鏈所組成:

  • 單一節點總帳來模擬在單一組織內的多個分區的生產環境。
  • 多節點總帳來模擬生產環境內多個組織的多個分區。
  • 在區塊鏈上散發的非集中式應用程式的開發工具。

非集中式應用程式 (dApps) 是對等網路的電腦,而不是在單一電腦執行的應用程式。區塊鏈在內容中,將 dApp 視為與外界溝通的區塊鏈網路互動的智慧型合約的用戶端應用程式。適合用來 dApps 介紹都位於在 BlockchainHub bit.ly/2rRkijj

建置在 Azure 中的區塊鏈基礎結構的主要特性如下:

  • 建立安全的環境會公開受保護的端點。這可以透過 Azure 虛擬網路、 Azure App Services VNet 整合或網路安全性群組。
  • 開發智能合約,使用任何可用的開發工具,例如 Blockstack 核心、 以太坊 Studio 或 Truffle。
  • 自動化部署的虛擬機器和平台做為服務元件的參與者元件。這可以透過 Azure Resource Manager 和 PowerShell 指令碼啟用。
  • 保護資料和邏輯,使用使用者層級驗證和授權,所實作的 Azure AD 來保護應用程式和 Api 的存取。
  • 一般情況下,建置適用於使用區塊鏈分類帳,運用 Azure 的企業功能以及全球發佈的企業解決方案整合的架構。

Azure 的 BaaS,簡單的說,表示不只是公用雲端裝載提供者,分散式總帳,但是建置及提供非集中式的區塊鏈技術執行的應用程式的原始和整合式平台。[圖 3說明平台架構。

Azure 區塊鏈作為-服務堆疊
[圖 3 的 Azure 區塊鏈作為-服務堆疊

現在讓我們來探索佈建的 Azure BaaS 功能的數位交易紀錄資料庫。首先,我必須存取 Azure 入口網站 (portal.azure.com),並從 Azure Marketplace 建立新的服務 |區塊鏈] 區段中。我可以選取從數個數位總帳技術 — 在此情況下,我將建立以太坊協會多節點交易記錄資料庫,並快速佈建我在 Azure 中的區塊鏈網路。

以太坊協會

以太坊協會範本會部署以太坊多成員網路,其中包含一組採礦節點和交易的節點。佈建,可能需要 20 分鐘,視網路,此時我可以設定其他以太坊帳戶並開始使用智慧合約和 dApp 開發,到系統管理員的 [Web] 頁面的大小而定。

佈建程序會引導您完成輸入必要的組態設定來佈建在 Azure 中的以太坊總帳的五個步驟:

步驟 1:設定基本設定,包括資源前置詞命名的所有產生 Azure 資源佈建在指派的資源群組,為所有已部署的虛擬機器的系統管理員和部署的 Azure 區域的驗證認證。

步驟 2:解決網路大小和效能。您可以指定的成員數目 (最多 12)、 協會中的每個成員 (採礦節點記錄交易內的區塊鏈網路)、 儲存體複寫 (本地備援或異地備援) 以及效能採礦節點數目。您也可以設定負載平衡的交易節點數目,其代表的使用者或具有已部署的區塊鏈應用程式的互動點。

步驟 3:這個步驟是以太坊節點的特定項目。我可以指定以太坊網路識別碼,可識別網路的唯一值,並將節點要使用的對等互連彼此。此外,我可以指定第一個區塊,並呼叫發生時,會產生方式,可以由平台的自動或手動提供我自己的 JSON 檔案。

步驟 4:我部署以太坊協會分類帳中的資源之前,出現我輸入的組態設定的摘要。從這裡,我可以下載 JSON 範本檔案來自動化的類似的資源設定與 Azure Resource Manager 部署。[圖 4預期部署於以太坊的交易記錄資料庫,以及範本檔案的程式碼片段的佈建的 Azure 資源。

以太坊協會多節點交易記錄資料庫的資源範本檔
[圖 4 以太坊協會多節點交易記錄資料庫的資源範本檔

此範本檔案可用來自動化部署類似的資源在未來,使用.NET 或 PowerShell 指令碼的組合。

中的 C# 程式碼**[圖 5**描述自動化已識別的 Azure 資源的部署範本所產生的 DeploymentHelper 類別。您需要參考下列套件,執行程式碼:

  • Microsoft.Azure.Management.Authorization
  • Microsoft.Azure.Management.ResourceManager
  • Microsoft.Rest.ClientRuntime.Azure.Authentication

圖 5 DeploymentHelper 類別

class DeploymentHelper
{
  string subscriptionId = "your-subscription-id";
  string clientId = "your-service-principal-clientId";
  string clientSecret = "your-service-principal-client-secret";
  string resourceGroupName = "resource-group-name";
  string deploymentName = "deployment-name";
  string resourceGroupLocation = "resource-group-location";
  // Must be specified for creating a new resource group
  string pathToTemplateFile = "path-to-template.json-on-disk";
  string pathToParameterFile = "path-to-parameters.json-on-disk";
  string tenantId = "tenant-id";
  public async void Run()
  {
    // Try to obtain the service credentials
    var serviceCreds = await ApplicationTokenProvider.LoginSilentAsync(
      tenantId, clientId, clientSecret);
    // Read the template and parameter file contents
    JObject templateFileContents =
      GetJsonFileContents(pathToTemplateFile);
    JObject parameterFileContents =
      GetJsonFileContents(pathToParameterFile);
    // Create the resource manager client
    var resourceManagementClient =
      new ResourceManagementClient(serviceCreds);
    resourceManagementClient.SubscriptionId = subscriptionId;
    // Create or check that resource group exists
    EnsureResourceGroupExists(resourceManagementClient, resourceGroupName,
      resourceGroupLocation);
    // Start a deployment
    DeployTemplate(resourceManagementClient, resourceGroupName, deploymentName,
      templateFileContents, parameterFileContents);
  }

同樣地,PowerShell 指令碼登入 Azure 訂用帳戶,註冊所需的資源提供者,然後啟動部署的範本檔案中所識別的資源中所示**[圖 6**。

[圖 6:正在啟動部署

# sign in
Write-Host "Logging in...";
Login-AzureRmAccount;
# select subscription
Write-Host "Selecting subscription '$subscriptionId'";
Select-AzureRmSubscription -SubscriptionID $subscriptionId;
# Register RPs
$resourceProviders = @("microsoft.compute","microsoft.resources","microsoft.network");
if($resourceProviders.length) {
  Write-Host "Registering resource providers"
  foreach($resourceProvider in $resourceProviders) {
    RegisterRP($resourceProvider);
  }
}
#Create or check for existing resource group
$resourceGroup = Get-AzureRmResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue
if(!$resourceGroup)
{
  Write-Host "Resource group '$resourceGroupName' does not exist.
    To create a new resource
    group, please enter a location.";
  if(!$resourceGroupLocation) {
    $resourceGroupLocation = Read-Host "resourceGroupLocation";
  }
  Write-Host "Creating resource group '$resourceGroupName' in location
    '$resourceGroupLocation'";
  New-AzureRmResourceGroup -Name $resourceGroupName
    -Location $resourceGroupLocation
}
else{
  Write-Host "Using existing resource group '$resourceGroupName'";
}
# Start the deployment
Write-Host "Starting deployment...";
if(Test-Path $parametersFilePath) {
  New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName
    -TemplateFile $templateFilePath -TemplateParameterFile $parametersFilePath;
} else {
  New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName
    -TemplateFile $templateFilePath;
}

整個解決方案,其中包含範本和指令碼檔案,可用於從我的 GitHub 存放庫,下載bit.ly/2INgNEP

完成之後,檢閱使用條款及授權條件,並按一下 [建立部署的資源。在 20 分鐘內,您必須啟動並執行功能完整的區塊鏈分類帳。重點是記得儲存開發 dApps,包括所需的重要資訊:

  • RPC 端點:您需要此位址來建立 dApp 開發環境,例如以太坊 Remix 和協會區塊鏈之間的通訊。
  • SSH 資訊:您需要認證才能登入的區塊鏈環境和設定參數,例如最常用於解除鎖定 Coinbase 帳戶並啟動採礦新區塊。

Coinbase 是我數位電子錢包 」,其中包含用來雜湊區塊中,以及我 Ether,Ethereum,贏得採礦程序的一部分的加密貨幣我簽章金鑰。在部署時在 Azure 中的新以太坊協會總帳,此帳戶是最初遭到鎖定,因此我要它解除鎖定之前可以發佈智能合約。使用 SSH 的說明,請連接到交易的節點以太坊協會網路及解除鎖定 Coinbase 帳戶,就像這樣:

geth attach -- opens the Geth console
personal.unlockAccount(eth.coinbase)

當系統提示您提供複雜密碼,我會輸入 gethadmin 密碼,我在 [組態精靈] (不以太坊私密金鑰複雜密碼) 的步驟 1 中指定。根據預設,此動作將帳戶解除鎖定 Coinbase 5 分鐘。您可以變更使用不同的簽章 unlockAccount; 方法的持續時間,如下所示:

eth.coinbase -- address of the coinbase account
personal.unlockAccount('address', 'passphrase', 'duration') --
  unlocking the account for a longer time period

如果您想知道 「 geth"命令的 line-of-business,很多用途的命令列工具執行完整的 Ethereum 節點中移至實作。

一旦 Coinbase 帳戶解除鎖定,這代表時間 0、 網路啟動時。此動作之後,節點可以接受的交易。交易可以是帳戶的建立、 移動 ether、 建立智能合約或任何區塊鏈的狀態變更的形式。然後,在定期的時間,用來設定網路,網路地雷的下一個區塊。此區塊是藉由結合所執行的交易之間的最後一個區塊,而現在,再加上前一個區塊與 nonce 雜湊的雜湊計算的雜湊 — 可以調整,以嘗試滿足工作證明的條件區塊中的位元的序列。

這是採礦的本質。這個值會滿足 「 概念工作 「 相依於的運氣或暴力密碼破解的困難的計算工作。區塊會達成共識,然後接受的網路,因此在您的鏈結前, 兩個區塊,並依此類推。

開發智能合約

需要完整的書,以瀏覽的開發中以太坊智能合約詳細資料。在本文中,我想要開始使用提供的指標,並了解技術與架構中使用的全貌。

若要撰寫及部署智能合約中以太坊,,您可以使用任何開發環境,可在 Azure 中,或存取完整外部瀏覽器型 IDE,例如 Ether 研習營 (ether.camp) 或以太坊 Remix (remix.ethereum.org)。

以程式設計的語言,在 Solidity (solidity.readthedocs.io) 是熱門合約導向語言,區塊鏈程式設計,使用類似 JavaScript 的語法。

在用戶端,支援以太坊節點與互動的程式設計語言包括 C#、 c + +、 JavaScript 和更多功能。您可撰寫 C# 程式碼使用 NEthereum 等程式庫 (nethereum.com),可與以太坊 geth、 eth 或使用 RPC 的同位檢查的用戶端互動以太坊的完全受控的.NET 整合程式庫。媒體櫃有非常類似的功能,JavaScript 以太坊 Web3 RPC 用戶端程式庫,也就是實際的區塊鏈用戶端互通性標準。

比方說,若要讓透過 NEthereum 智慧合約呼叫,我需要執行下列作業:

  • 取得智慧合約位址,以及應用程式二進位介面 (ABI)。ABI 是智慧型的合約中呼叫函式和以太坊節點從取回資料的介面。
  • 取得要叫用智慧合約上的函式簽章。
  • 執行呼叫時,該帳戶的複雜密碼將以太坊帳戶解除鎖定。
  • 進行呼叫,以智慧的合約。

中的程式碼片段**[圖 7**顯示幾個非常基本的步驟,使用 NEthereum 程式庫。

[圖 7 呼叫智慧合約

// Obtain the contract ABI
abi = db.GetContract(ballot.ContractID);
// Get the function address to call on the smart contract
var func = web3.Eth.GetContract(
              abi,
              ballot.ContractID).GetFunction("vote");
// Unlock the account so you can call the smart contract
string passphrase = db.GetAccountPassphrase(agreement.OriginatorAccount);
bool success = await web3.Personal.UnlockAccount.SendRequestAsync(
                        ballot.OriginatorAccount,
                        passphrase,
                        120);
// Make the smart contract call
if (success)
{
  object[] args = new object[] {
     id,
     ballot.OriginatorAccount,
     ballot.CounterSigAccount,
     123 /* sample proposal number to vote for */ };
  // Call the "vote" function on the smart contract
  await func.SendTransactionAsync(ballot.OriginatorAccount, args);
}

叫用的智慧合約,以在 Solidity,撰寫如下的選票合約會公開投票方法,它會接受輸入的提案數字。當轉換投票時,選民 (訊息傳送者) 中的投票旗標設為 true,以避免雙重的投票,而且可增加提案計數器,考慮本身的投票的加權。[圖 8這顯示的程式碼。

在 Solidity 程式碼中的圖 8 A 選票合約

pragma solidity ^0.4.0;
contract Ballot {
  struct Voter {
    uint weight;
    bool voted;
    uint8 vote;
  }
  struct Proposal {
    uint voteCount;
  }
  address chairperson;
  mapping(address => Voter) voters;
  Proposal[] proposals;
  /// Create a new ballot with different proposals
  function Ballot(uint8 _numProposals) public {
    chairperson = msg.sender;
    voters[chairperson].weight = 1;
    proposals.length = _numProposals;
  }
  /// Give a single vote to the given proposal
  function vote(uint8 toProposal) public {
    Voter storage sender = voters[msg.sender];
    if (sender.voted || toProposal >= proposals.length) return;
    sender.voted = true;
    sender.vote = toProposal;
    proposals[toProposal].voteCount += sender.weight;
  }
}

請注意,這樣在 Solidity 程式碼中,使用類似 JavaScript 的語法,與幾個變體,例如合約、 結構和位址的關鍵字或三個斜線 ("/ /") 的註解是強類型語言。我使用以太坊 Remix 來開發的智能合約中提供網頁型 IDE 來開發、 測試以及部署在 Solidity。

Azure 區塊鏈 vNext

讓我們看看哪些期許看起來像在 Microsoft 的願景的區塊鏈技術。即將推出,Microsoft 機密協會 (Coco) Framework 是開放原始碼系統,可讓符合所有的索引鍵的企業需求的機密性、 控管和效能,而是在相同的高度可調整、 機密的區塊鏈網路時間提供加速生產環境的區塊鏈技術的企業採用的方法。

Coco (bit.ly/2Ior8YA) 結合現有區塊鏈通訊協定,受信任的執行環境的分散式系統,並啟用符合企業需求的區塊鏈的密碼編譯網路該傳遞:

  • 輸送量和延遲達到資料庫的速度
  • 更豐富、 更有彈性、 商務特有的機密性模型
  • 透過分散式管理的網路原則管理
  • 不具決定性的交易支援
  • 降低的能源耗用量

請務必請注意 Coco 不是獨立的區塊鏈通訊協定。相反地,它提供值得信賴的基礎使用哪一個現有的區塊鏈通訊協定例如以太坊、 仲裁、 Corda 和其他人可以提供完整的企業級的交易記錄資料庫的解決方案整合。Coco 旨在為開啟及使用區塊鏈中的任何通訊協定相容。它可達到此目的使用受信任的執行環境 (TEE),例如 Intel 軟體防護擴充功能 (SGX) 和 Windows 虛擬安全模式 (VSM),以啟用要執行的分散式的總帳的實體節點的受信任的網路建立。[圖 9顯示 Coco Framework 架構。

Coco Framework 的高階概觀
[圖 9 高階 Coco Framework 概觀

Microsoft 計劃稍後在 2018 年開放原始碼 Coco Framework 程式碼。

最後,Azure Blockchain Workbench,也就是主要的機制適用於企業客戶開始使用區塊鏈上文字。Azure 區塊鏈是設計來協助企業建立和部署新的類別,用於與多個共用商務程序和資料的應用程式的功能與 Azure 服務的集合不完全信任的組織。目前,客戶可以將這些服務部署至其訂用帳戶,並將其與在 Azure Marketplace 上區塊鏈整合。利用 Azure Blockchain Workbench 繁重的工作為了它們,讓它們可以專注小於上 scaffolding,並且有更詳細的邏輯和智能合約。

Azure Blockchain Workbench,馬上就可以在 Azure Marketplace 中 (aka.ms/tryworkbench)。


Stefano Tempesta是 Microsoft 區域經理和 MVP,以及分會領導人 CRMUG 覅痹,最大的世界中的 Dynamics 365 / CRM 專家社群。講師的課程有關 Dynamics 365、 區塊鏈和機器學習服務,而在國際 IT 研討會發表演說,包括 Microsoft Ignite 和 Tech Summit 發言 Tempesta。他成立 Blogchain 空間 (blogchain.space),為寫入區塊鏈技術的相關部落格MSDN MagazineMS Dynamics 世界*,及發佈機器學習在 Azure AI 資源庫實驗 (gallery.azure.ai)。*

感謝下列 Microsoft 技術專家來檢閱這篇文章:James McCaffrey
Dr。James McCaffrey 適用於在美國華盛頓州雷德蒙的 Microsoft Research他參與開發多項 Microsoft 產品,包括 Internet Explorer 和 Bing。Dr。McCaffrey 要聯絡jamccaff@microsoft.com


MSDN Magazine 論壇中的這篇文章的討論