本文转载自微信公众号「区块链研究实验室 」,作者链三丰。转载本文请联系区块链研究实验室公众号。
概述
本文将向大家提供有关区块链技术开发入门时应该了解的一切的简要概述,在这里给大家展示的是学习区块链应用程序开发的基础知识,由区块链提供支持的去中心化应用程序(Dapps)。
有许多不同的区块链为我们的Dapp提供动力,而最大的就是我们所知的以太坊。
为了与以太坊生态系统进行交互,则需要一个以太坊钱包和一些以太坊。Metamask,是最受欢迎的以太坊钱包之一。
以太坊钱包分为三个部分:
- 以太坊账户-可以发送和接收以太坊的实体
- 公钥-用户可以将以太坊发送给的地址
- 私钥—访问您的以太坊
使用以太坊钱包与以太坊网络中的Dapp进行交互,假设您想将以太坊交易为另一种加密货币,您可以通过去中心化交易所Uniswap进行交易来做到这一点。
Uniswap由以太坊区块链提供支持,它基于智能合约所运行,而智能合约,它是区块链上的程序。
智能合约包括三个主要部分:
- 用户-使用智能合约的人。
- 代码-使用智能合约时会发生什么。
- 存储-智能合约将更改的对象。
Dapp是用许多智能合约编写的,例如:Uniswap是由许多智能合约提供支持的Dapp。
Dapps在Web开发中可与后端或服务器端相媲美,客户端将连接到以太坊虚拟机上的智能合约,而不是连接到集中式服务器。
那么,我们如何为Dapp创建智能合约?
引入Solidity
Solidity是一种用于EVM的高级编程语言,您可以在Solidity中编写智能合约。
我们将探索智能合约的一些基本语法和一般结构,然后将为自己的令牌编写一个简单的合同。
如果您熟悉另一种编程语言,您会发现一些问题,
- 布尔值—正确或错误
- Uint —整数(数字确定X幂的大小)
- 地址-以太坊地址
- 字符串—文本
这是您将在Solidity中使用的基本数据结构,
- 数组-从零开始的项目列表(可以是固定数字或动态数字)
- 映射—存储具有键值对的数据
- 结构-用于定义存储变量的新方法
- 枚举-创建自己的数据结构
设置可见性是智能合约开发的重要组成部分,这样您的私人地址将不为公开,而这些关键字可以应用于变量和函数,
- 公开-任何人都可以调用此功能
- 私人-只有合同可以调用此功能
- 查看—此函数返回数据且不修改数据
- 纯-函数将不会修改,甚至不会读取合同的数据
- 应付账款—功能可以接收以太坊
您将大量使用公共和私人的资源,拥有这些,我们就可以开始编写一些代码了。
制作MediumToken
首先,我们使用Pragma关键字声明solidity的版本,然后将Solidity指定为编译器以及什么版本。
让我们来看一个例子:
- pragma solidity >=0.4.22 <0.6.0;
这是开发过程中的重要一步,编写惊人的智能合约只是为了发现编译器不能与您使用的Solidity版本配合使用。
我们将为Medium创建一个令牌,我们称它为MediumToken。
接下来,我们需要实际声明合同。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- }
这里只需添加令牌的基本结构即可。
智能合约需要具有构造函数,当我们的代码部署到区块链时,该功能将运行一次。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- }
- }
在这里,我们声明的地址变量等于msg.sender,这是调用该函数的人员的地址。又是你
在构造函数中,我们需要做的另一件事是铸造MediumTokens,设置电源。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- }
此时您铸造了420个MediumToken,该数字是您想要的任何数字。构造函数运行后,我们需要创建所有余额的映射。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- mapping (address => uint256) public balances;
- }
这是一个公共映射,意味着任何人都可以看到它并与其进行交互。
接下来,我们需要编写一个函数,该函数将允许用户发送其MediumToken。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- mapping (address => uint256) public balances;
- function send(uint amount, address recipient) public {
- require(balances[msg.sender] >= amount);
- require(balances[msg.sender] -amount <= balances[msg.sender]); require(balances[recipient] + amount >= balances[recipient]);
- balances[msg.sender] -= amount; // Always subtract first balances[recipient] += amount; // Add amount to recipient
- }
- }
让我们分解一下,我们的send函数将接受uint形式的金额,它还可以接受收件人的地址,而且此功能将是公开的,因此任何人都可以看到它。
此时我们要做的第一件事是创建一些require语句,这样我们就可以检查发送者的钱包中是否确实有令牌数量。
另外2项要求声明是安全措施,第一个是确保发送方在发送令牌后的余额小于或等于;第二个是确保收款人的地址大于或等于交易前的地址。
- require(balances [msg.sender] -amount <= balances [msg.sender]);
如上述操作,我们创建了420个MediumToken,将它们分配给所有者,并创建了将其发送出去的功能!
如果您想再次查看它,这是完整的代码。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- mapping (address => uint256) public balances;
- function send(uint amount, address recipient) public {
- require(balances[msg.sender] >= amount);
- require(balances[msg.sender] -amount <= balances[msg.sender]); require(balances[recipient] + amount >= balances[recipient]);
- balances[msg.sender] -= amount; // Always subtract first balances[recipient] += amount; // Add amount to recipient
- }
- }
如果您完成了最终合同,您就可以将其部署到区块链上。