主页 > imtoken下载钱包 > 以太坊智能合约开发

以太坊智能合约开发

imtoken下载钱包 2023-07-13 05:10:48

以太坊的应用称为去中心化应用(DApp)。 DApp的开发主要包括两个部分:

智能合约开发 用户界面开发

在本文中,我们将介绍智能合约的开发语言solidity。

如果你想马上开始学习以太坊DApp开发,可以访问汇智网提供的优秀在线互动教程:

以太坊DApp实战入门教程 以太坊去中心化电商应用开发实践

Solidity 是一种语法类似于 JavaScript 的高级语言。 它旨在以编译方式生成 EVM 代码。 您稍后会发现,创建用于投票、众筹、封闭式拍卖、多重签名钱包等的合约非常容易。

siteqq.com 以太坊智能合约_以太坊智能合约的开发语言是_以太坊智能合约应用

写下你的第一份合同

让我们从一个非常基本的示例开始,如果您还不明白,请不要担心,我们将逐步了解更多细节。

合同 SimpleStorage {uint storedData; function set(uint x) {storedData = x;}function get() 常量返回 (uint retVal) {return storedData;}}

在 Solidity 中,合约由一组代码(合约的函数)和数据(合约的状态)组成。 合同位于以太坊区块链上的一个特殊地址。

uint 存储数据; 这行代码声明了一个state变量,变量名为storedData,类型为uint(256位无符号整数)。 你可以把它看成是数据库中的一个存储单元,就像管理数据库一样,可以通过调用函数来查询和修改。 在以太坊中,通常只有合约的所有者才能这样做。 在本例中,set 和 get 函数分别用于修改和查询变量的值。

以太坊智能合约应用_siteqq.com 以太坊智能合约_以太坊智能合约的开发语言是

与许多其他语言一样,在访问状态变量时,不需要像这样添加前缀。 在它的前面。

这个合约还不能做很多事情(受限于以太坊的基础设施),它只是允许任何人存储一个数字。 世界上任何人都可以访问这个号码,缺乏(可靠的)方法来保护您发布的号码。 任何人都可以调用 set 方法来设置一个不同的号码来覆盖您发布的号码。 但你的号码将保留在区块链的历史中。 稍后我们将学习如何添加访问限制,以便只有您可以修改此号码。

编写代币合约

下一个合约将以最简单的形式实施加密货币。 任何人都可以在不注册用户名和密码的情况下向他人发送货币,只要他们拥有一对以太坊公钥和私钥。

contract Coin {//关键字“public”使得可以从合约外部访问变量。 address public minter;mapping (address => uint) public balances;//事件允许轻客户端有效地响应变化。 event Sent(address from, address to, uint amount);//这个构造函数的代码只在合约创建时运行。 函数 Coin() {minter = msg.sender;}function mint(address receiver, uint amount) {if (msg.sender != minter) return;balances[receiver] += amount;}function send(address receiver, uint amount ) {if (balances[msg.sender] < amount) return;balances[msg.sender] -= amount;balances[receiver] += amount;Sent(msg.sender, receiver, amount);}}

以太坊智能合约的开发语言是_以太坊智能合约应用_siteqq.com 以太坊智能合约

这份合约引入了一些新概念,让我们一一了解。

解决公共铸造者;`

这行代码声明了一个可公开访问的地址类型的状态变量。 地址类型的值大小为 160 位,不支持任何算术运算。 适用于存储合约地址或其他人的公私钥。 public 关键字自动为其修改的状态变量生成访问函数。 没有 public 关键字的变量将无法被其他合约访问。 此外,只能编写本合约中的代码。 自动生成的函数如下:

function minter() returns (address) { return minter;

当然,我们自己添加这样的访问功能是不可行的。 编译器会抱怨这个函数与状态变量同名。

siteqq.com 以太坊智能合约_以太坊智能合约应用_以太坊智能合约的开发语言是

下一行代码创建一个公共状态变量以太坊智能合约的开发语言是,但具有更复杂的类型:

映射(地址=> uint)公共余额;

这种类型将一些地址映射到一个无符号整数。 一个映射可以被认为是一个哈希表,每个可能的键对应的值实际上被初始化为全0。 这个类比不是很严格。 对于一个映射,不可能得到一个包含它所有键或值的链表。 所以我们必须记住我们添加到映射中的内容。 更好的方法是维护这样的链表,或者使用其他更高级的数据类型。 或者仅在不受此缺陷影响的场景中使用映射,例如此示例。 本例中public关键字生成的访问函数会比较复杂,其代码大致如下:

函数 balances(address _account) returns (uint balance) {return balances[_account];}

通过这个功能我们可以方便的查询到特定账户的余额。

以太坊智能合约的开发语言是_以太坊智能合约应用_siteqq.com 以太坊智能合约

事件发送(地址从,地址到,单位值);

这行代码声明了一个“事件”。 由发送函数中的最后一行代码触发。 客户端(以及服务器应用程序)可以以很少的开销收听这些区块链触发的事件。 当事件被触发时,监听器会同时收到from、to、value的参数值,可以方便的用来跟踪交易。 要侦听此事件,您可以使用以下代码:

Coin.Sent().watch({}, '', function(error, result) {if (!error) {console.log("Coin transfer: " + result.args.amount +" coins were sent from " + result.args.from +" to " + result.args.to + ".");console.log("现在余额:\n" + "发件人:" + Coin.balances.call(result.args.from) +"接收方:" + Coin.balances.call(result.args.to));}}

请注意在客户端中如何调用自动生成的余额函数。

这是一个特殊功能的硬币。 它是一个构造函数,将在创建合约时运行,之后无法调用。 它永久存储合约创建者的地址。 msg(连同 tx 和 block)是一个神奇的全局变量,它包含一些属于区块链的属性,可以被合约代码访问。 msg.sender 始终保存当前函数的外部调用者的地址。

最后,真正被用户或其他合约调用来完成本合约功能的函数是 mint 和 send。 如果合约创建者之外的其他人调用 mint,则什么也不会发生。 任何人(拥有一定数量的代币)都可以调用 send 将一些代币发送给其他人。 请注意,当您通过此合约向某个地址发送一些代币时,您在区块链浏览器中查询该地址时将看不到任何内容。 由于发送代币导致的余额变化仅存储在代币合约的数据存储中。 通过事件,我们可以轻松创建一个“区块链浏览器”以太坊智能合约的开发语言是,可以跟踪您的 SGD 交易和余额。

如果您想了解更多关于Solidity的语言特性,可以下载我们免费的pdf电子书:Solidity官方文档中文版。