dType:以太坊上分布式系统和功能编程的数据类型

  • 时间:
  • 浏览:56

  我谈到了dType背后的愿景,一个以太坊的分布式系统。现在,我们将更详细地探讨该协议,并了解如何在其基础上构建一个全局功能编程协议。dType旨在就数据类型达成共识并促进互操作性。

  以太坊编程输入

  我们知道类型系统是什么:一个允许您将特定类型分配给变量、表达式、函数等的系统,并执行编译和/或运行时检查以查看是否遵守该规则。这就消除了由于在代码中不正确地连接各种接口而导致的一组错误。

  solidity是一种静态类型的语言。除了本地提供字符串或地址等基本类型之外,它还允许开发人员使用struct构造复杂的类型。

  现在的情况是,每个开发人员都可以根据自己的需要自由地创建自己的复杂数据类型。这太棒了!但是如果你想建立一个更棒的世界计算机,在那里你有项目整齐地相互合作,会发生什么呢?最后会有很多项目,每个项目都在自己的封装中定义自己的类型。要使任何两个项目互操作,需要对这些项目有更深入的了解,甚至可能需要对源代码进行更改。

  全局注册表分布式编程

  这就是分布式系统的用武之地。社区可以讨论并就要创建和使用的类型达成共识,每个人都可以从使用这些知名的和经过测试的类型中获益。更容易看到哪些合同和外部功能使用某种类型,更容易将项目互连并分析区块链数据。

  我们提议的分散式系统包含一个dType注册表合同,它引用了所有被接受的类型以及实现它们的合同。

  

  例如,要将某些标准值类型从solidity注册到系统中,使用以下格式:

  {

  "contractAddress":

  ,

  "typeChoice": 0,

  "source": ,

  "name": "uint256",

  "types": []

  }

  {

  "contractAddress":

  ,

  "typeChoice": 0,

  "source": ,

  "name": "string",

  "types": []

  }

  如果我们想要注册复杂数据类型,一个例子是:

  {

  "contractAddress": "0x105631C6CdDBa84D12Fa916f0045B1F97eC9C268",

  "typeChoice": 0,

  "source": ,

  "name": "myBalance",

  "types": [

  {"name": "string", "label": "accountName", "relation": 0},

  {"name": "uint256", "label": "amount", "relation": 0},

  ]

  },

  {

  "contractAddress": "0x91E3737f15e9b182EdD44D45d943cF248b3a3BF9",

  "source": ,

  "name": "myToken",

  "types": [

  {"name": "address", "label": "token", "relation": 0},

  {"name": "myBalance", "label": "balance", "relation": 0},

  ]

  }

  类型合约将地址存储到包含实际类型定义的已部署类型库中,以及用于结构化和破坏数据的辅助函数和高阶函数(hofs),如map、filter、reduce。

  pragma solidity ^0.5.0;

  pragma experimental ABIEncoderV2;

  library myBalanceLib {

  struct myBalance {

  string accountName;

  uint256 amount;

  }

  function structureBytes(bytes memory data) pure public

  returns(myBalance memory balance);

  function destructureBytes(myBalance memory balance) pure public

  returns(bytes memory data);

  function map(

  myBalance[] memory balanceArr,

  function(myBalance memory) external pure

  returns (myBalance memory) callback

  )

  view

  public

  returns (myBalance[] memory result);

  }

  类型合同还存储其他可选合同的地址。例如,我们可以有一个Type Storage Contract,它存储该类型的数据条目。这些数据条目可以跨不同项目聚合。

  现在,开发人员可以在自己的合同中使用类型库。或者,他们可以更进一步,使用这个系统来保存他们的数据。虽然第一个选项的动机很明确:以太坊中的数据标准化和一致性,但是与当前的方式相比,使用全局存储系统的第二个选项是不同的模式。但是,全局存储系统允许我们做一些有趣的事情,如下所示。

  纯功能合同/库

  为了深入探讨这个协议的好处,我需要介绍另一个重要的组件。

  除了类型库和存储合约之外,开发人员还可以创建具有纯函数的合约或库,这些函数知道如何与所选类型交互。我们正在将业务逻辑与状态分离。这是以太坊通用功能编程系统的第一步。

  如果在dtype注册表中注册这些纯函数,并告诉注册表函数的输入和输出类型,就可以开始做一些了不起的事情。您可以在系统中实现自动化。

  我们可以使用一种或多种注册类型:

  pragma solidity ^0.5.0;

  pragma experimental ABIEncoderV2;

  contract myBalanceAndTokenFunctions {

  using myTokenLib for myTokenLib.myToken;

  function doubleBalance(myTokenLib.myToken memory myTokenData)

  public

  pure

  returns(myTokenLib.myToken memory myNewTokenData);

  }

  在dtype注册表中注册doubleBalance函数类型可以这样做:

  逻辑链接状态

  假设您希望在类型具有的某个数据条目上运行一些纯函数,然后将结果存储在函数的输出类型存储协定中。

  

  总结

  1. 使用与要使用的纯函数对应的typeHash调用run(),以及与函数输入对应的dataHashes;每个dataHash引用一个存储条目

  2. dType知道如何获取每个输入数据,因为它知道输入类型并可以检索存储协定地址

  3. bet365官方 dType还具有pure函数所在的契约/库地址

  4. dType可以在与每个最终输出类型相对应的存储协定中插入计算结果。

  函数编程

  什么是函数式编程,在各种在线资源中详细讨论了优点和缺点。它已经成为一种广泛使用的编程范例,允许开发人员创建可扩展的项目。

  尽管solidity本身不是一种函数式编程语言,但是通过改变编码模式,我们仍然可以从一些特性中获益。

  我们现在将构建块看作是一个智能合约,其中包含一个封装对象,其中包含只能从内部理解的状态更改函数。这更类似于面向对象编程,并带来互操作性和可伸缩性问题。不一定是针对单个项目,而是针对全球以太坊系统。

  以太坊的函数编程

  使用函数式编程范例的一些好处也可以在以太坊中得到利用。

  幂等,纯函数更容易测试

  我们将业务逻辑与存储分开。纯函数bet365库的审计和测试更容易,因为它们没有副作用,并且它们的输出是确定性的。您甚至可以在Mainnet上运行测试套件!这通常不会在当前项目中发生。您将要编写的大多数代码都具有这种性质。降低测试难度意味着更多编写安全代码的机会。

  可重复使用的存储模式

  用于dType本身的存储模式和所有类型存储协定可以是相同的。这降低了构建,测试和审计代码的成本。

  高风险、小表面

  包含bug风险最高的代码将是将纯函数链接结果转换为状态更改的核心。但是,这个核心是我们都可以参与,测试和审计的一般模式。因此,它有可能成为最安全的拼图。

  当您对每种类型的数据进行了聚合和透明的分类后,任何人都可以使用这些数据插件并做一些了不起的事情-从经典的自动化工具到基于人工智能的工具。

  我们离现实世界计算机的前景更近了一步。


bet365 bet365官方 bet365