通学智能合约系列(十一)--地址交易<上>

2024-01-31 14:40

本文主要是介绍通学智能合约系列(十一)--地址交易<上>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Solidity–地址交易篇

兄弟们,真的是我,我又回来了。经历了懒散与加班的日子,让我们一起继续智能合约的征程吧。废话不多说,直接上干货。

1.以太坊地址的本质

在以太坊中,有两种类型的账户:一种是外部账户(EOAs,Externally Owned Accounts),另一种是合约账户(Contracts Accounts)。当我们提到账户这个术语的时候,我们通常指的是外部账户(EOA),当提到合约账户的时候我们通常称其为“合约”。

而以太坊的地址分为两种,普通地址和合约地址

  1. **普通地址:**普通账号地址,可以进行转账交易,可以显示余额,可以发送交易,通过私钥控制,没有相关联的代码。就像是银行账户,每个用户都有属于自己的账户和密码,只能互相转账,没有其他属性。
  2. **合约地址:**合约本身包含了一段代码,当满足合约的特定条件时便会运行条约代码,不单用于转账。就像A与B签订了一个合同,当A满足了合同上的条件,B才会做执行一些任务。而A需要满足的条件和B会执行的任务都是在创建合约地址时就被记录在合约地址代码当中的。

如下图所示,标识1的地方就是我们的外部账户地址,而标识2就是我们的合约地址:

在这里插入图片描述

下面我们来看一段代码:

pragma solidity ^0.4.16;contract AddressTest{address public account;//0xca35b7d915458ef540ade6068dfe2f44e8fa733c//0x692a70d2e424a56d2c6c27aa97d1a86395877b3aaddress public account1 = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;address public account2 = 0x692a70d2e424a56d2c6c27aa97d1a86395877b3a;function changeIt() view returns(uint160){return uint160(account1); //1154414090619811796818182302139415280051214250812}function changeIt2() view returns(address){return address(1154414090619811796818182302139415280051214250812);}}

操作上述代码之后,我们发现:我们的地址的确是一个160字节的数字。uint160和地址之间的转换也是相当地丝滑。另外我们可以看到上述代码中的account1account2是有一个大小关系的,明显是account1大于account2.是的,没错,我们的地址是可以比较大小的。大家都是有经验的开发人员,在这里我们就不演示这个东东了。

2.使用钱包转移资金

这一小节,我们来说说以太坊转账。没有吃过猪肉 ,总见过猪跑吧。虽然我们没有用以太坊转过账,但是应该会听说过前几天币圈暴跌的新闻,还有币所在交易高峰拔网线的传闻。导致大家没有办法交易,也可以说是没有办法进行转账操作。再具体了解以太坊转账之前,我们先来看看这么一个关键字payable

2.1 转账之-payable
pragma solidity ^0.4.16;contract payableTest{//payable 关键字代表我们可以通过这个函数给我们的合约充值function pay() payable{}}

在这里插入图片描述

那么假如我们没有这个payable关键字 行不行呢? 思考两秒钟。

去掉payable关键字之后,我们发现会报错如下:

transact to payableTest.pay errored: VM error: revert.
revert	The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value.	Debug the transaction to get more information

翻译过来 就是需要这个关键字的意思。

2.2 获取金额-balance

​ 上面我们已经将钱转到了我们的合约里面,但是我们该怎么拿到这个钱呢?这就要说一个属性叫做balance

我们来看看如下代码:

pragma solidity ^0.4.16;contract payableTest{function pay() payable{}function  getBalance() returns(uint){return this.balance;}}

在这里插入图片描述

如此一来,我们就成功完成了一笔转账。

3.合约与合约账户

上节我们看到通过this.balance获取到了合约的余额。我们接触过一些编程语言都知道,this一般就指示的是类的对象,那我在合约中,他代表什么呢?我们来看如下代码:

 //0x5e72914535f202659083db3a02c984188fa26e9f 合约地址//0x0971B5d216af52c411C9016BBc63665b4E6f2542 thisfunction getThis() view returns(address) {return this;}

部署执行后,我们发现this 就是一串地址。且就等于我们的合约地址。那么就很好理解了,this.balance拿的就是合约里面的money。

那么,如此类推的话,我们是不是也可以通过函数的方式拿到账户钱包的地址呢?答案是显然的。

function getAccountBalance(address account) view returns(uint){return account.balance;}

在这里插入图片描述

复制钱包地址后执行getAccountBalance方法后,我们便可以得到钱包里的余额,和我们上面显示的余额一致呦。相信到这里,大家对合约及账户有了更清晰的认识。

4.transfer转移资金
4.1账户间转账

上节我们学习了如何将钱包里面的钱转到合约里面去,但是我们如果想跨钱包(或者可以说是跨账户)去转账,该怎么做呢?这里我们就要引入一个函数。没错,就是我们的transfer函数。下面我们继续来看一段代码。

pragma solidity ^0.4.16;contract transferTest{//注意转账 需要添加payable关键字function transfer(address account) payable{account.transfer(msg.value);}
}

在这里插入图片描述

我们的操作步骤如下:

  1. ​ 编写转账的智能合约,
  2. ​ 部署,并输入交易金额为50ether
  3. ​ 当前账号选择147,转账目标账户为583
  4. ​ 执行转账操作,
  5. ​ 查看结果,最终结果闲置 147账户 50ether,而583账户为350ether(初始为300ether)。

如此一来,你就可以向你的好兄弟或者女友转账啦~

4.2 账户转账到合约

​ 上面我们学习了如何进行账户间转账,那么我们如何利用transfer将账户的钱转账到合约里面呢?

这里需要有点有技巧,我们先直接看代码

pragma solidity ^0.4.16;contract transferTest{function transfer() payable{this.transfer(msg.value);}function () payable{}}

上述直接用一个括号()表示的函数,我们在这里叫做回调函数。关于回调函数的内容,我们放在后续讲解。

编译部署执行transfer方法后,我们会发现,账户中的钱已经转到合约中了。乍一看,和我们上述的2.2.1转账有点类似呢?但他们的不同点在哪里呢?下面我们来分析下。得,别分析了,就是一样的。

到这里,我们关于转账的介绍就结束了,不过还有这里大家肯定还有一些疑惑,关于msg.value怎么来的?我们留在下节介绍。

这篇关于通学智能合约系列(十一)--地址交易<上>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664128

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time