主页 > imtoken钱包app安卓版 > 区块链技术-智能合约-以太坊(译)

区块链技术-智能合约-以太坊(译)

imtoken钱包app安卓版 2023-01-28 08:10:30

本文经 IBM 的 Glynn Bird 同意翻译和发布。 文章虽然没有深奥的理论,但是用简洁的语言描述了区块链技术、智能合约和以太坊。 文章用一个慈善筹款的工作例子来演示以太坊的核心功能。

区块链(BlockChain)技术备受关注,不仅因为它被用作记录交易的账本,而且还作为加密货币(如比特币)的引擎; 更重要的是,它可以封装代码和数据,成为“智能合约”。 》(Smart Contract)。本文介绍了一种开源区块链技术:以太坊,并以慈善捐赠为例,构建了一个智能合约,展示了这项技术的强大。

什么是区块链?

区块链是一种数据结构,将数据按时间顺序存储在一个可以无限扩展的链表中,就像账本一样。 区块链数据结构通过分布式对等计算机网络维护,没有中央“主”节点。 链表中的每个块都包含一定数量的交易,这些交易代表数据库状态的变化,例如,钱从一个账户转移到另一个账户。 交易由网络中的多个节点验证,并最终存储在区块链的块中。 每个区块都包含一个带符号的哈希(Signed Hash),其中包含链表中前一个区块的内容。 可以通过遍历整个区块链来验证:某个区块的哈希值确实存储在链表的下一个区块中。 区块链由这样的图表示:

创世区块是最原始的区块。 H() 是散列。 交易就是交易。 时间是时间轴,从最初的区块链到无限。

比特币浏览器区块链查询_比特币区块链交易查询_区块链与比特币的联系

区块链包含一系列从一个地址到另一个地址的价值转移。 地址代表系统中的唯一帐户。 该地址实际上是一个公钥,其对应的私钥属于创建帐户的用户。 如果不使用该帐户的私钥对其进行数字签名,则无法从该帐户转移价值。

在加密保护交易的同时,区块链还提供了关于数据库状态的分布式共识。 它保证价值转移要么发生一次,要么不发生。 应用程序开发人员可以放心:因为数据一旦存储,就无法修改,可以信任。 区块链网络提取一个计算机节点来生成区块链中的下一个区块。 这个节点需要花费大量的计算能力来解决一个数学任务。 这个节点事先是未知的。 该节点找到问题的答案,可以命名下一个区块并发布,网络中的其他节点验证发布的区块。 由于工作量证明,赢得发布的节点以两种方式获得奖励:接收新铸造的加密货币,并从创建交易的一方收取费用。 这个过程称为“挖矿”,其目的是:

1. 以严格控制的速度铸造新的加密货币

2. 奖励在网络中验证交易并达成共识的“矿工”

在实践中,具有非常快的特殊硬件,挖矿具有优势,因此出现了“军备竞赛”:矿工使用越来越多的硬件来维持相同的货币获取速度。

比特币是区块链最著名的实际例子。 比特币是一种可以兑换真钱的加密货币。 它可以通过区块链交易在比特币账户(钱包)之间转移。 在撰写本文时,比特币对等网络拥有 7,000 个节点。

以太坊和智能合约

吸引应用程序开发人员的区块链的主要特性是:

1. 区块链是别人跑的。 如果你的应用程序将数据存储在每个人都使用的区块链中,则不需要为数据提供存储机制。 区块链中的节点提供存储激励:交易费用和铸造新硬币的机会。

2、区块链提供分布式共识机制,你自己很难做到。

3、区块链为用户提供匿名机制。 账户身份(ID)是一个公钥,不一定与人直接相关。

4.“价值”可以从一个账户转移到另一个账户,但成本低于传统的真实汇款机制。

5. 如果区块链是可信的,那么存储在该区块链中的交易也是可信的。

以太坊采用了区块链的原理,在区块链上增加了智能合约的创建:智能合约是一种可以保值、存储数据、封装代码、执行计算任务的应用程序。 与比特币一样,以太坊也包含一种称为以太币的货币。 以太由计算机节点挖出,交易由节点验证,交易存储在分布式共识区块链中。 以太币可以在账户(公钥)之间和智能合约之间转移。

智能合约允许匿名方签订具有约束力的协议,每一方都完全了解交易。 价值可以在账户之间转移,也可以放在智能合约中托管(escrow)。 由于合约就是代码,开发者可以做任何他们想做的应用,你的想象力是唯一的限制。

智能合约示例:智能赞助(smartSponsor)

在本文的其余部分,我们构建了一个智能合约,允许拥有帐户的用户进行以下交互:

1.慈善组织从事募捐,称为受益人thebenefactor

2. 赞助实施者为该慈善机构募捐,称为实施者 therunner

3. 想要提供赞助的用户称为赞助商

4. 以太坊区块链的一个挖矿节点,验证交易,称为矿工 theminer

我们称为 smartSponsor 的合同是:

1.实施者therunner通过募捐活动为慈善事业募捐

2. 在构建合约时,implementer therunner将接受捐赠的受益人命名为benefactor

3. 实施者 therunner 然后邀请用户提供赞助。 用户调用智能合约的功能。 该函数的作用是将以太币从发起人sponsor的账户中转账到合约中。 这些以太币存放在合约中,直到回调发生

4. 在合约的整个生命周期中,各方都可以看到谁是受益人thebenefactor,筹集了多少以太币,从谁那里筹集(当然发起人可以匿名)

区块链与比特币的联系_比特币浏览器区块链查询_比特币区块链交易查询

合约订立后,必然会出现以下两种现象之一:

1. 募捐按计划执行,执行人指示合约将所有捐款转移给受益人

比特币区块链交易查询_比特币浏览器区块链查询_区块链与比特币的联系

2. 因故无法实施募集,实施方指示合约返还发起人承诺的募集资金

比特币浏览器区块链查询_比特币区块链交易查询_区块链与比特币的联系

以太坊允许使用称为 Solidity 的编程语言在代码中定义智能合约。 它是一种类似 Java 的语言。 合同就像一个 Java 类。 区块链交易存储在成员变量中比特币浏览器区块链查询,可以调用合约的方法来查询合约或改变合约的状态。 由于区块链的副本分布到网络中的所有节点,任何人都可以查询合约以获取合约中的公开信息。

我们的合约将包含以下方法:

1. smartSponsor——合约的构造者。 它初始化合约的状态。 合约的构建者指定合约取款时受益的账户地址。

2. 质押——任何捐赠以太币的赞助商都可以调用。 赞助商可以提供支持筹款活动的信息,但这不是必需的。

3. getPot——返回合约中当前的以太币总量。

4. 退款——将承诺的捐款退还给支持者。 只有合约的所有者才能调用此方法。

5. 提款——将合约中的所有捐款转入受益人账户。 同样,只有合约的所有者才能调用此方法。

这个想法是让合同具有约束力:如果发起人将以太币转移到合同中,除非归还整个合同,否则发起人无法取回它。 通过这种方式,所有数据都是公开可访问的,这意味着任何可以访问以太坊的人,通过合约代码,都可以看到谁制定了合约,谁是受益人,以及谁承诺了哪笔捐赠。

重要的是,所有改变合约状态的操作(构建、承诺、退款或将合约中的全部出资转移到受益人账户)都需要在区块链中创建交易。 这意味着在“挖掘”事务并存储块之前不会存储数据。 有些操作只是读取现有合约状态(getPot 或读取公共成员变量),这些操作不需要挖矿。 这很重要但很微妙:写入速度很慢(我们必须等到挖矿完成)。 也许写操作的结果最终不会进入区块链(如果你的代码抛出异常或有其他错误),调用者需要给矿工一个工作的激励。 这在以太坊术语中称为气体。 所有的写操作都需要支付 gas 来改变区块链的状态。

我们很幸运能够使用相同的软件,配置一个本地测试区块链,并运行一个矿工来生成我们自己的所谓的以太币,而无需加入以太坊网络和购买以太币。 这样我们就不必浪费真实的以太币来测试我们的代码。

坚固代码

这是我们用 Solidity 语言编写的智能合约的完整代码:

contract smartSponsor {
      address public owner;
      address public benefactor;
      bool public refunded; 
      bool public complete;
      uint public numPledges;
      struct Pledge {
          uint amount;
          address eth_address;
          bytes32 message;
      }
      mapping(uint => Pledge) public pledges;
      // constructor
      function smartSponsor(address _benefactor) {
          owner = msg.sender;
              numPledges = 0;
          refunded = false;
          complete = false;
          benefactor = _benefactor;
      }
      // add a new pledge
      function pledge(bytes32 _message) {
          if (msg.value == 0 || complete || refunded) throw;
          pledges[numPledges] = Pledge(msg.value, msg.sender, _message);
          numPledges++;
      }
      function getPot() constant returns (uint) {
          return this.balance; 
      }
      // refund the backers
      function refund() {
          if (msg.sender != owner || complete || refunded) throw;
              for (uint i = 0; i < numPledges; ++i) {
              pledges[i].eth_address.send(pledges[i].amount);
          }
          refunded = true;
          complete = true;
      }
      // send funds to the contract benefactor
      function drawdown() {
          if (msg.sender != owner || complete || refunded) throw;
          benefactor.send(this.balance);
          complete = true;
      }
   }

请注意,该代码未提及交易、区块、gas 或区块链或加密货币的任何术语。 该代码仅存储成员变量的状态。 以太坊简单地创建必要的交易,将它们提交给网络进行验证(本例中使用我们的测试网络),并将它们存储在区块链上。 一切复杂的东西都避而不见。 因此,我们的代码很小(50 行)并且易于理解。

这很重要,因为智能合约是关于分享信任的; 合同各方应明确各自的承诺,捐助资金流向何方,谁可以开展哪些业务。 代码越简单,就越容易验证合约是否可信。

运行智能合约

要运行合约,必须先运行以太坊。 我的 Ubuntu Server 安装指南位于 . 我使用的是IBM的Bluemix虚拟机(译注:这个不是必须的)比特币浏览器区块链查询,然后使用apt-get添加一些需要的包。

假设你已经在你的测试网络上创建了4个以太坊账户,并按照我的安装指南配置了挖矿流程,我们可以复制smartSponsor代码并在以太坊控制台上执行:

> git clone https://github.com/glynnbird/smartsponsor.git> cd smartsponsor> geth attach

从 geth 控制台执行与以太坊 API 交互的 JavaScript 命令

> loadScript("./smartsponsor.js")Contract transaction send: TransactionHash: 0xe797ce5c1e5eeaae6e4bd09ad6564f9deba1beeeb7f09b6c16eec728584e370c waiting to be mined...true> Contract mined! Address: 0x15590c0417f6421fd35e113db0fdb2055df2344b[object Object]

> loadScript("./smartsponsor.js")Contract transaction send: TransactionHash: 0xe797ce5c1e5eeaae6e4bd09ad6564f9deba1beeeb7f09b6c16eec728584e370c waiting to be mined...true> Contract mined! Address: 0x15590c0417f6421fd35e113db0fdb2055df2344b[object Object]

smartsponsor.js 文件创建了一些变量,这些变量是我们创建的 4 个以太坊账户(theminer、therunner、thebenefactor、thesponsor)的地址,这样很容易理解以下代码片段中谁做了什么。 该文件还包含编译Solidity源代码、构建smartSponsor合约、生成therunner合约实例以及确保合约的受益者是受益者的一系列指令。

在交易被挖掘之前,合约不会生效。 这可能需要几秒钟或几分钟,具体取决于计算机的运行速度。 我们观察一下契约(契约赋值给变量ss):

> ss{
  address: "0xe021f45922e141f5e17d05a4b2721ec972065960",
  transactionHash: "0x77ba5bc77f0a62888c08084a7c00cf00b6cc024f88f988e9daada751788c8693",
  allEvents: function(),
  benefactor: function(),
  complete: function(),
  drawdown: function(),
  getPledge: function(),
  getPot: function(),
  numPledges: function(),
  owner: function(),
  pledge: function(),
  refund: function(),
  refunded: function()}

我们可以看到合约有一个地址,这意味着它可以发送和接收以太币,还有一个 transactionHash,用于在区块链中查找位置。 还列出了合约上的公共、可调用函数。 现在让我们调用一些:

> ss.benefactor()"0x63de8807ac0bd63be460be0de250749c4df1dcb0"> ss.owner()"0x458305055882d53663b41a00eebd0b657469843f"> ss.getPot()0> ss.numPledges()0> ss.complete()False

我们可以看到合约的owner和beneficiary是不同的账户(分别是therunner和thebenefactor),合约的状态初始化为无捐赠和赞助。 从我们自己的区块链副本中读取是免费的,因此我们不需要提供燃料。

接下来,我们向发起人账户发送一些钱,原始账户没有以太币:

> personal.unlockAccount(thesponsor,"password");> eth.sendTransaction({from: theminer, to: thesponsor, value: 100000000000000000});"0xd4fc641311e31abb6546c3503c367c6ac971b0ad9cb4bcd4c56597e3b98d6d7a"> eth.getBalance(theminer);4.9524805801917e+22> eth.getBalance(thesponsor);100000000000000000

接下来,验证赞助商用户并向我们的智能合约赞助一些钱:

> personal.unlockAccount(thesponsor,"password");true> ss.pledge("Good luck with the run!", {from: thesponsor, value: 10000000, gas: 3000000});"0xc0880c4151946014389e135bcbefe39fb8f786e9e3e0ce077fa5f967e2a31ab3"

value 参数是我们希望转移到合约的以太币数量。 10000000 看起来很多,但是单位是wei。 1 以太币有 1000000000000000000 wei!

返回值是交易ID。 我们必须等到交易存储在区块链上才能看到合约状态发生变化:

> ss.getPot()10000000> ss.numPledges()1> ss.pledges(0)[10000000, "0x225905462cf12404757852c01edfd2ec0bf0dbe9", "0x476f6f64206c75636b2077697468207468652072756e21000000000000000000"]

调用 pledges(0) 返回第一个捐赠承诺,包含它的值、赞助者的地址和消息(作为字节串)。 我们可以不断调用质押函数来增加捐款,看着锅越来越大。 经过 7 次赞助商捐赠,我们有:

> ss.getPot()
70000000

请注意,合约获得了发起人质押的全部以太币,但扣除了发起人的账户,比质押的价值多一点。 为什么? 因为调用质押函数的操作必须提供gas作为动力。

当实施者准备好完成合约时,只需调用 drawdown 函数:

> personal.unlockAccount(therunner,"password");true> ss.drawdown({from: therunner, gas:3000000});"0x082424d8057b8c250f8b86cda05211628bb3bae513ce27bf6194445ae035a3c4"

合约挖矿完成后,我们应该可以看到受益人的账户已经收到了合约的捐赠金额:

> eth.getBalance(thebenefactor);70000000> ss.getPot()0

智能合约在合约中以托管方式记录多笔捐款,这些捐款要么转移给受益人,要么退还给赞助商。 该代码确保只有合约的创建者才能退还捐赠,或将其全部转移给受益人,并防止在合约完成后进一步捐赠。 整个过程中,合约状态可以被各方查询,全部包含在50行代码中!

使用geth命令行工具执行的命令实际上是Javascript语句。 您还可以使用自己的客户端代码调用远程 API 并与真实(或测试)网络进行交互。 这样,创建一个基于互联网的智能合约前端就很简单了。

您可以使用Mist浏览器创建账户、查看和操作合约,就像一个智能合约的应用商店。 Mist 有很多设想,但目前它是一个相对简单的钱包应用程序和合约浏览器。

区块链只是一个分布式数据库?

区块链是一种按时间顺序存储数据的账本,是一个跨越多个节点的分布式数据库。 但它与Cloudant分布式数据库的含义不同:它不把数据分成片来分散工作负载,让每个片可以处理一部分。 在其网络中,所有节点都必须处理所有数据更改。 此外,挖矿节点执行工作证明以证明该节点有资格实施预期的更改。 这使得写入数据的过程极其缓慢,以太坊每秒只能处理 20-30 个。 交易(不是每个用户 20-30 笔交易,而是整个区块链)。

以太坊不仅仅是一个数据仓库。 它增加了新功能:在区块链中封装代码和数据。 这样,相关各方就可以确信合同会按照其规定行事。 与签订纸质合同、律师、公证人、银行、保险、清算相比,有很大的不同。

区块链和智能合约能做什么?

以太坊只是一种智能合约平台,可用于构建基于区块链的应用程序。 最合适的用例是:

立即想到的应用是:拍卖、借贷、遗嘱、登记、众筹、股权和投票。

从金钱和计算的角度来看,写操作是非常昂贵的,所以智能合约多用于写操作少但数据价值高的应用。 虽然读操作是免费的,但是只有一些简单的查询操作。 您可以索引存储的数据,但与典型的数据库不同,它没有查询语言,也无法提取或聚合数据。

区块链还有其他缺点。 网络中的所有参与者都需要存储所有的块。 数据没有分成可以单独处理的部分,因此每个节点必须存储整个数据库并处理每个更改。 使用工作量证明模型在网络中分配信任是一种巧妙的迂回解决方案,但在现实中,需要数千万个节点消耗能量来证明节点是可信的。 最后,以太币的价值和比特币一样,容易受到投机,使得以太币的金融价值不稳定。 以太坊在路线图上有性能改进、可扩展性和工作证明替代品,但在撰写本文时,它们只是愿景。

原文链接: