Loading...

理解以太坊智能合约

理解以太坊智能合约

电报联系方式

许多人可能听说过“智能合约”这个词,也许还知道它们是一种能够在区块链上执行的“代码”。

然而,对于智能合约是如何在以太坊区块链上运行的,这一概念可能还不太清晰。本文将阐述智能合约在以太坊区块链上的执行方式,以更加易懂的方式来解释。

了解区块链

区块链技术的核心理念是建立一个分布式账本,它是一种特殊类型的数据库,被许多参与者共享。这个数据库实际上就是一份交易记录,记录着网络中发生的每一笔交易。每个人都可以拥有自己的备份,这个备份具有强大的货币激励机制,从而降低了互不信任的成本。

在传统交易中,通常需要引入第三方机构(被双方信任的中间人)来解决互不信任的问题,例如支付宝、PayPal或银行。然而,通过使用区块链技术,我们可以在一个网络中建立信任,不再需要依赖第三方机构。这是通过强大的激励机制来防止欺诈行为。

理解以太坊智能合约

区块链网络可以看作是一组机器,它们都拥有相同的交易记录列表。因为每个人都有相同的记录,所以试图欺骗网络接受虚假交易变得非常困难。通过结合加密算法和货币激励,只要所有参与者都遵循规则,就可以构建一个安全的区块链网络。

什么是智能合约?

以太坊与比特币之间的一个重要区别在于以太坊引入了智能合约的概念。 比特币主要是一种数字货币,用于价值存储。 但以太坊不仅仅是一种数字货币,尽管“智能合约”这个术语可能有些误导性。 这些智能合约实际上不是传统意义上的合同,它们也并不具备特别高级的智能。 相反,它们只是可以在区块链上运行的代码。

智能合约是以太坊网络上的一种特殊帐户。我们有用户帐户,还可以拥有智能合约帐户。

用户帐户有:

  • 地址(有点像我们的银行帐号 – 比特币也有同样的概念)
  • 余额(我有多少钱: 以太)

智能合约账户有:

  • 地址
  • 余额(有多少钱: 以太)
  • 状态
  • 代码

地址在智能合约中充当类似于常规用户帐户的唯一标识符。

余额与常规用户帐户的余额相似。但不同之处在于,智能合约的余额表示其代码可以掌控的资金,它可以管理这些资金。因此,如果代码存在问题,可能会导致资金处理错误。

智能合约帐户的状态包含了所有在智能合约中声明的变量和它们的当前值。这类似于大多数编程语言中类的实例变量的概念。需要注意的是,智能合约对象可以被看作是一个类实例,但不同之处在于它们始终存在于区块链网络中(除非明确销毁)。

智能合约的代码是经过编译的字节码,可以在以太坊客户端和节点上执行。这些代码在创建智能合约时被执行,其中包含了可供调用的函数,类似于面向对象编程语言中的对象的方法。

contract Counter {
uint counter;

function Counter() public {
counter = 0;
}
function count() public {
counter = counter + 1;
}
}

假设我们使用上面的代码创建一个智能合约。 代码有一个类型为uint(无符号整数) 名为“counter” 的变量。 counter变量的内容(值)就是该合约的状态。 每当我们调用count()函数时,此智能合约的区块链状态将增加1,这个状态是对任何人都可见的。

以太坊和比特币在交易层面的区别

比特币交易非常简单,它只做一件事,就是进行交易。 忽略细节,这一切都归结为TO(谁收钱),FROM(谁汇款)和AMOUNT(多少钱)。 这让比特币网络中的参与者可以传递价值并存储价值。

以太坊很大的不同是其交易还有一个DATA字段。 DATA字段支持三种类型的交易:

  • 价值传递 (和比特币相同)
    • TO :收款地址
    • DATA :留空或留言信息
    • FROM :谁发出
    • AMOUNT :发送多少
  • 创建合约
    • TO :留空 (这就是触发创建智能合约的原因)
    • DATA :包含编译为字节码的智能合约代码
    • FROM :谁创建
    • AMOUNT :可以是零或任何数量的以太,它是我们想要给合约的存款。
  • 调用合约函数
    • TO: 目标合约账户地址
    • DATA: 包含函数名称和参数 – 标识如何调用智能合约函数
    • FROM :谁调用
    • AMOUNT : 可以是零或任意数量的以太,例如可以支付合约服务费用。

以太坊交易

价值传递

{
to: ‘0x687422eEA2cB73B5d3e242bA5456b782919AFc85’,
value: 0.0005
data: ‘0x’ // 也可以附加消息
}

就是转移一定数量的以太到某个地址,如果我们愿意也可以向交易添加消息。

创建智能合约

{
to: ”,
value: 0.0
data: ‘0x6060604052341561000c57xlb60405160c0806……………’
}

如上所述,TO为空表示创建智能合约,DATA包含编译为字节码的智能合约代码。

调用合约方法

{
to: ‘0x687422eEA2cB73B5d3e242bA5456b782919AFc85’, //合约
value: 0.0
data: ‘0x6060604052341561000c57fe5b60405160c0806……………’
}

函数调用信息放在DATA变量中,把这个交易信息发送到要调用的智能合约的地址。

关于成本和执行

代码的执行需要调用者支付费用,这个费用以Gas的形式计量。Gas可以看作是驱动以太坊虚拟机运行的燃料,我们可以将其类比为每个指令执行的成本。

在发起调用时,我们需要设定一个称为Gas Limit(Gas消耗上限)的值,表示预计此次调用可能消耗的最大Gas数量。举例来说,如果我们的代码陷入了永久循环,执行的Gas消耗也不会超过我们设定的Gas Limit。

Gas执行费用是由网络中的矿工(运行代码的节点)来决定的,他们会根据执行代码的复杂性和Gas消耗来设定相应的费用。

智能合约是如何运行的?

当智能合约部署到以太坊网络时,任何人都可以调用智能合约的功能。在智能合约上调用函数在很多方面和“正常”编程类似,但在执行方面存在一些差异。

假设我们有一个“MyObject”类型的对象。 该对象有一个名为“myFunction”的函数。 要调用它,我们可以简单地引用对象的实例,调用哪个函数以及调用它的参数。

myObjectReference.myFunction(parameters);

如果函数返回任何值,则可以把它保存在变量中:

myVariable = myObject.myFunction(parameters);

从概念上讲,调用智能合约是一回事。 唯一的区别是我们必须将有关调用的信息放入交易中,对其进行签名并发送到以太坊网络中执行。

假设想用一些参数调用智能合约“0x0123456”上函数“myFunction”,大概包含以下四个步骤:

理解以太坊智能合约

智能合约应用:Token (通证或代币)

我们自己也可以在以太坊上创建自己的代币。大多数这些代币都是在以太坊上创建的,这个概念非常简单,我们需要关注以下几个信息:

  • 总供应量
  • 帐号
  • 账户中的金额
  • 代币的流动

通过用户和金额之间的简单映射,可以实现1,2和3:

Map<Account, Double> usersAndTheirMoney;

使用构造函数,我们可以在自己的帐户中设置初始供应量(或在任意其他中帐户中分配):

public Token(Account initialAccount, double initialSupply) {
usersAndTheirMoney.put(initialAccount, initialSupply);
}

代币的移动是通过简单的功能完成的,只需从一个帐户中减去并添加到另一个帐户:

public transfer(Account from, Account to, double amount) {
verifySenderOfMoneyIsCaller(from);
verifySenderOfMoneyHasEnoughMoney(from, amount);
usersAndTheirMoney.put(from, usersAndTheirMoney.get(from)-amount);
usersAndTheirMoney.put(to, usersAndTheirMoney.get(to)+amount);
}

开发联系:DEXDAO

 

 

 

© 版权声明

相关文章

暂无评论

暂无评论...