2018 年 7 月

第 33 卷,第 7 期

区块链 - 使用 Azure 区块链即服务的分散应用程序

通过Stefano Tempesta

作为一种方法来简化业务流程、 验证的事务,并减小欺诈的可能性,区块链已捕获的业务和技术领域的关注。本文介绍了即服务 (BaaS) 在 Microsoft Azure 中,介绍如何使用它来生成一种受保护的数据结构和创建分布式事务的数字账本的区块链。

有很多有关区块链以及如何它作为数字账本的比特币 Internet 上的宣传资料。到哪些区块链是篇不错的介绍性文章,请参阅bit.ly/2IsoWeJ,和有关区块链的工作原理的更多技术概述,请参阅在 2018 年 3 月 Jonathan Waldman"区块链基础知识"一文颁发MSDN 杂志 》 (msdn.com/magazine/mt845650)。

区块链是公共、 私有或联盟 (即,限制为仅限命名成员) 可以是安全、 共享、 分布式分类帐。它是安全的因为它使用加密以创建交易、 很难 (如果使用当前的计算技术不是不可能) 用来篡改。所有节点或对等方之间共享的链中是一个数据存储,并为您很快就会看到,约定的窗体中的业务逻辑。区块链值确实直接链接到它们参与的实体数。严重的是,区块链数据和协定分发,这意味着有多个数据库的副本。和的多个副本都是,它成为越可信。最后,区块链是数字账本,追加仅发生每笔交易的不可变的记录的事务数据库,

我想要强调此点有关正在分布式的账本的区块链。传统账本集中式和使用第三方系统或中间商,批准和记录事务。将信用卡、 银行、 标识管理系统等。这种方法创建信任和缩放的挑战。您是否信任您中转站代理充当代理的所有事务?代理可以成为单一故障点?可以它受到安全威胁?

在区块链,分类帐分布在整个网络,并为事务中间的任何第三方系统无需。该技术将保持数据,如下所示的对等文件共享系统,多个的副本各对等方获取整个数据集的副本。没有人拥有全部内容,但每个人都拥有一份。图 1描绘了这种排列方式。

分散的分布式的分类帐
图 1: 分散分布式的分类帐

第一个区块链,比特币,出现了在 2009 年,不同的限制。作为数字账本,它只需记录事务并不会跟踪数字资产帐户余额。以前的事务,以下块链中的记录的事务的不可变的历史记录的链接进行验证的创世所有权。此外,比特币未定义任何特定逻辑上如何处理事务和条件,例如,两个所涉及参与方必须达成的加密货币交换中。

区块链技术发展添加了智能协定,将逻辑添加到事务小代码段。将智能协定视为商品或服务协定中的法律条款的计算机代码表示形式。新区块链账本出现了市场上最受欢迎是以太坊 (ethereum.org) 和 Hyperledger Fabric (hyperledger.org) 将智能协定功能添加到网络。在这些 (让我们称这些区块链 2.0) 数字账本,智能协定现在存储在块中,并分发到所有节点以及相关数据。

区块链 3.0

比特币区块链通常称为区块链 1.0。它是简单的分类帐事务记录序列中并在任意给定时刻表示网络的状态。可以将其只需为分布式数据库。

但是正如数据库已演变成将随着时间的推移通过添加逻辑执行功能 — 形式的存储过程,例如,区块链引入了智能协定来处理逻辑层。但是,智能协定可以对它们的存储位置的块中仅包含的数据。它们无法访问外部数据或系统中,为调用该区块链的区块链中断信任"circle"以外的服务提供用于加密的安全和不可变性的事务。CRM、 ERP 和工资系统所有表示不属于区块链,但可能会涉及交易中的数据的交换中的外部实体。区块链需要一种方法来安全地接收外部数据,以及访问的链外的代码的安全执行。

若要解决这一要求,Microsoft 引入了 cryptlets"区块链 3.0,"数据、 逻辑和云服务的区块链的一部分。图 2显示功能的进度。

区块链的演变
图 2 演变而来的区块链

Cryptlets 是编写的任何语言,可以在一个受信任的独立安全容器内执行,并且可以通过安全通道进行通信的链外的代码模块。Cryptlets 通过提供服务,如加密、 日期和时间的事件、 外部数据访问和身份验证扩展到外界智能协定。Microsoft 引入了 cryptlets,因为其开放源代码项目的一部分代号为"Bletchley"(bit.ly/2Iv9VZz),这已经发展成为显示在 Microsoft Build 开发者大会中 Azure Blockchain Workbench 产品5 月。

在网站上所述,Bletchley 是构建一个企业联盟区块链生态系统的体系结构方法。为了清楚起见,这不是区块链堆栈。它是 Microsoft 的方法使分布式的账本 (区块链) 平台的企业和构建实际解决方案时保持打开状态的平台解决实际业务问题。

Azure Blockchain Workbench (aka.ms/abcworkbench) 利用不同区块链账本和现有云服务,以启用适用于企业的可靠的区块链生态系统。它是使用简化的界面,使用户可以创建充分利用 Azure 服务,包括 Azure Active Directory (Azure AD)、 Azure 密钥保管库、 Azure SQL 数据库、 Application Insights 的端到端区块链应用程序易于使用的工具Azure Functions 和服务总线。它会围绕常用区块链,并可用于生成基于区块链应用程序参考体系结构。

我编写了 MSDN 杂志 》 6 月刊的"Azure Blockchain Workbench 简介"一文中了解有关 Azure Blockchain Workbench 的详细信息 (msdn.com/magazine/mt846726)

这些重回 cryptlets,提供开发人员能够使用与第三方系统和数据访问,集成等跨领域功能一种易于使用的方法。但我将焦点切换到分散的应用程序开发在区块链上之前,我需要一个平台,用于在公共或专用分布式分类帐传送安全集成的解决方案。Microsoft Azure 提供全球范围内的内存占用,允许构建超大规模、 安全的数据和执行平台以便在任何区块链的平台上提供的下一代应用程序。

区块链即服务

在 Azure 上的区块链 (bit.ly/2rQUO5q) 提供了构建和部署区块链应用程序的快速、 低成本、 低风险的平台。Azure 中,基本上,具备区块链即服务 (BaaS) 提供的几个简单部署,企业的模板的大多数热门账本,包括以太坊、 仲裁、 Hyperledger Fabric、 Corda 和的详细信息。

足够的销售额宣传,让我们深入了解在 Azure 门户中特定分类帐配置之前调查的 Azure BaaS,一些主要功能。Azure 区块链组成:

  • 若要模拟单个组织内的多个部门的生产的单节点分类帐。
  • 若要模拟多个组织内的多个部门的生产环境的多节点分类帐。
  • 适用于分散式区块链上分发的应用程序的开发工具。

分散的应用程序 (dApps) 是对等网络的计算机而不是一台计算机运行的应用程序。在区块链上下文中,将 dApp 视为与区块链网络进行交互的智能协定进行通信的客户端应用程序。DApps 的全面介绍,可在 BlockchainHub bit.ly/2rRkijj

构建在 Azure 中的区块链基础结构的主要特征是:

  • 建立安全的环境,公开受保护的终结点。这可以通过 Azure 虚拟网络、 Azure 应用服务的 VNet 集成或网络安全组。
  • 开发智能合同,使用任何可用的开发工具,如 Blockstack 核心、 以太坊 Studio 或 Truffle。
  • 自动执行部署的虚拟机和平台即服务组件的参与者组件。可以通过 Azure 资源管理器和 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:此步骤是特定于以太坊节点。我可以指定以太坊网络 ID,用来标识网络的唯一值和节点将用来与每个其他对等互连。此外,我可以指定第一个块,名为生成,将生成方式,会自动通过该平台或通过提供我自己的 JSON 文件来手动。

步骤 4:将部署以太坊联盟分类帐中的资源之前,显示了我输入的配置设置的摘要。在这里,我可以下载 JSON 模板文件来自动执行类似的资源与 Azure 资源管理器中设置的部署。图 4预计以太坊分类帐,以及模板文件的代码片段的预配中部署的 Azure 资源。

资源模板文件中为以太坊联盟多节点分类帐的
图 4 资源模板文件中为以太坊联盟多节点分类帐的

此模板文件可自动在将来部署类似资源使用.NET 或 PowerShell 脚本的组合。

中的 C# 代码图 5说明 DeploymentHelper 类生成的自动标识 Azure 资源部署的模板。需要引用以下包要运行此代码:

  • 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 是我数字钱包,其中包含我用于哈希块和我经不起考验,以太坊,获得挖掘过程的一部分的加密货币的签名密钥。在部署新的以太坊联盟分类帐在 Azure 中时,此帐户是最初锁定,因此我需要我可以发布智能协定之前对其解除锁定。使用 SSH 的帮助,我连接到以太坊联盟网络事务节点并解锁 Coinbase 帐户,如下所示:

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

出现提示时提供通行短语,我输入我在配置向导 (不以太坊私钥密码) 的步骤 1 中指定的 gethadmin 密码。默认情况下,此操作解除 Coinbase 帐户锁定时间为 5 分钟。可以更改的持续时间使用不同的签名的 unlockAccount 方法,如下所示:

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

如果您想知道"geth"命令的代表,它是运行在 Go 中实现完整以太坊节点的多用途命令行工具。

解锁 Coinbase 帐户后,这表示时间零点、 网络启动时。此点之后,节点可以接受的事务。事务可能是形式的帐户的创建、 移动的方式、 创建智能合同或对区块链的状态的任何更改。然后,一次定期配置为在网络中,网络雷的下一个块。这种块是通过组合执行的事务之间的最后一个块; 现在,以及从上一个块和 nonce 的哈希的哈希来计算哈希-在可以进行调整以尝试满足工作证明的条件块中的位的序列。

这就是挖掘的本质。此值可令人满意"概念证明工作"取决于运气或暴力破解一个困难的计算任务。然后达成一致意见,将块接受的网络,因此在链中具有的前两个块,依此类推。

开发智能协定

它需要一整本书,经历开发中以太坊智能协定的详细信息。在本文中,我想要开始使用提供的指针和了解的技术和框架中使用的布局。

若要编写和部署智能协定中以太坊,可以使用任何可用在 Azure 中的开发环境,或访问完全外部的基于浏览器的 IDE 等经不起考验 Camp (ether.camp) 或以太坊 Remix (remix.ethereum.org)。

在编程语言,密度方面 (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);
}

调用智能协定,编写的密度,如下所示公开一个投票的方法,它接受输入的建议书数字的选票协定。时转换一票,投票者 (消息发送方) 中的投票的标志设置为 true 以防止 double 投票,并建议计数器已增加,考虑自身的投票的权重。图 8此显示的代码。

图 8: 选票协定 Solidity 代码中

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 开发智能协定中密度,为开发、 测试和部署提供基于 Web 的 IDE。

Azure 区块链 vNext

让我们看看哪些未来看上去与类似 Microsoft 愿景中区块链技术。即将推出,Microsoft 机密联盟 (Coco) 框架是一个开放源代码系统,使满足所有关键企业要求的保密性、 管理和性能,而是在相同的高度可缩放、 机密区块链网络时间提供一种方式来加速生产的区块链技术的企业采用。

Coco (bit.ly/2Ior8YA) 汇集了现有区块链协议,受信任的执行环境中,利用分布式系统和加密技术来启用企业的区块链网络的交付:

  • 吞吐量和延迟接近数据库的速度
  • 更丰富、 更加灵活且特定于业务的机密性模型
  • 通过分布式监管的网络策略管理
  • 对不确定事务的支持
  • 降低的能耗

请务必注意,Coco 不是独立的区块链协议。相反,它提供的受信任的基础的现有区块链协议综合以太坊、 仲裁、 Corda 和其他人提供完整的企业就绪的会计解决方案。Coco 旨在为打开状态且与任何区块链协议兼容。它来实现此目标通过受信任的执行环境 (TEE) 使用,如 Intel 软件防护扩展 (SGX) 和 Windows 虚拟安全模式 (VSM),若要允许创建受信任的网络的物理节点在其上运行分布式的分类帐。图 9显示 Coco 框架体系结构。

Coco 框架的高级概述
图 9 Coco 框架的高级概述

Microsoft 计划在 2018年开放源代码 Coco 框架代码。

最后,word 上 Azure Blockchain Workbench,这是适用于企业客户开始使用区块链的主要机制。Azure 区块链是一系列 Azure 服务和功能,可帮助企业创建和部署具有多个共享业务流程和数据的应用程序的新类不完全受信任的组织。目前,客户可以将这些服务部署到其订阅,并将其与在 Azure Marketplace 上的可用区块链集成。使用 Azure Blockchain Workbench 为他们完成繁重的任务,因此他们可以专注于较少的基架上和有关逻辑和智能协定的更多信息。

Azure Blockchain Workbench 现已在 Azure Marketplace 中 (aka.ms/tryworkbench)。


Stefano TempestaCRMUG 瑞士,世界上的 Dynamics 365 / CRM 专家的最大社区中的是 Microsoft 区域总监和 MVP,以及分会领导者。Tempesta 是一名讲师的课程有关 Dynamics 365、 区块链和机器学习,并在国际 IT 会议,包括 Microsoft Ignite 和技术大会上发表演讲。他成立了 Blogchain 空间 (blogchain.space),为编写有关区块链技术的博客MSDN 杂志 》MS Dynamics 世界*,并发布机器学习在 Azure AI 库试验 (gallery.azure.ai)。*

衷心感谢以下 Microsoft 技术专家对本文的审阅:James McCaffrey
ScriptoJames McCaffrey 供职于华盛顿地区雷蒙德市沃什湾的 Microsoft Research。他参与过多个 Microsoft 产品的工作,包括 Internet Explorer 和必应。Scripto可以在达到 McCaffrey *jamccaff@microsoft.com*


在 MSDN 杂志论坛讨论这篇文章