您的位置:首页 > 其它

区块链学习(4) -- Solidity开发入门必读

2021-01-31 22:49 267 查看

关于Solidity介绍

Solidity是以太坊智能合约编程语言,是一种静态类型语言,意味着每个变量(本地或状态变量)需要在编译时指定变量的类型(或至少可以推倒出类型)。Solidity提供了一些基本类型可以用来组合成复杂类型。Solidity可以分为值类型(Value Type)和引用类型(Reference Types)。

智能合约
一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。一个合约由一组代码(合约的函数)和数据(合约的状态)组成,并且运行在以太坊虚拟机上。合约具有读取交易数据、读取或写入合约自己的存储空间、读取环境变量(块高,哈希值,gas)和向另一个合约发送一个“内部交易”的能力。

环境搭建

1、Remix在线IDE

这里提供几个链接

https://ethereum.github.io/browser-solidity/#optimize=false&version=soljson-v0.7.1+commit.f4a555be.js
https://remix.ethereum.org/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.7.4+commit.3f05b770.js

注意编译时候版本的选择,选择到对应到版本
也可以搭建自己的智能合约编辑器

参考https://github.com/ethereum/remix-project

2、以太坊节点连接,这里我给出两种方式作为参考:

(1)Chrome浏览器+ Metamask插件扩展

详见metamask用法请添加链接描述

注意需要选择不同的网路,这里选择如下Rineby测试网络(建议使用Ropsten测试网络),根据提示获取测试ETH:

Ropsten测试网络获取eth地址:

https://faucet.ropsten.be/

(2)这里推荐Ganache
Ganache是用于快速以太坊和Corda分布式应用程序开发的个人区块链。 您可以在整个开发周期中使用Ganache。 使能够在安全,确定的环境中开发,部署和测试dApp。

官方文档
下载地址请添加链接描述

3、Remix如何选择节点


(1)部署环境选择"Injected web3",这样把通过metamask客户端将我们的合约部署到测试环境上

正常连接后,上图中如果Remix中Account显示的地址和eth数量与MetaMask中对应的地址和数量是一致的。如果没有连接到MetaMask,可以反复刷新Remix当前页连接(先确认MetaMask是正常状态、已切换到对应的测试网络),重新选择"Injected web3",直接提示连接,授权连接。
(2)第二种连接方式就是用Ganache,打开Ganache,如下图:

Remix选择Web3 Provider,对应本地的地址及端口设置好,与Ganache对应,如下:

4、准备好合约,合约如下:

pragma solidity ^0.4.17;

contract Faucet{
function withdraw(uint amount) public {
require(amount <= 100000000000000000); //0.1 Eth
msg.sender.transfer(amount);
}
function () public payable{}

}

5、这里我使用Ganache作为以太坊合约编译部署的节点,选择对应的编译版本,只要能编译能兼容目前版本即可,4.17可以选择4.17及大于4.17附近的几个版本。编译通过后就可以部署到节点了。

6、将合于部署到节点,选择正确的合约,然后点击Deploy,以下是两种连接测试节点的方式部署

(1)以下为在MetaMask中选择Rinkeby测试网络部署成功后合于地址:

0xA35FB05441e66D45cecaC190060F254275318364

部署成功:

(2)以下为在本地Ganache节点部署成功后的合约地址:

0x1811a314038e545a67c1A5FaB18c94634fAf6dD9

Ganache上查询部署的合约交易:

详细内容:

7、关于合约的操作(Rinkeby测试网络,建议使用Ropsten测试网络)

(1)首先向合约地址0xA35FB05441e66D45cecaC190060F254275318364转入1ETH

转入成功如下图

详情如下:

当向这个合约发起一个交易时候,如没有指明具体调用哪个合约函数,那么就会调用如下默认函数:

function () public payable{}

该函数用来接收以太币并把币存入余额。这个交易触发合约在EVM上被执行,并更新了余额,这样充值完成。
(2)从合约提以太币
我们在部署合约中部署了一个 withdraw(uint amount) 函数,在Remix中,我们可以找到部署合约后执行该函数入口:

注意这里amount使用wei为单位,成功后有如下交易:

注意这里可以看出我们利用合约函数Withdraw生成了一笔交易(调用了合约),这里显示0ETH,账户确实已经多了0.1ETH,那么这个对外支付记录在哪呢?

如下,Internal Txns,可以看到利用合约函数执行后产生的0.1eth

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: