solidity学习过程---msg

2023-10-27

solidity 5.0,remix测试(个人学习,欢迎指正)

msg(研究了好一会,感觉还是有点困惑)
  1. msg.sender —当前合约的调用者
    (1) 部署合约的地址
    (2)调用该合约的地址
  2. msg.value —随消息发送的 wei 的数量(其实并不太懂)
    (1)随消息发送??? 什么类型的信息 ???
    (2) msg.value随消息发送 ,发送到哪儿?
    (3)在remix部署时,设置value,只要调用该命令之后,直接发送到账户余额 why????
    测试代码如下所示
pragma solidity >=0.4.21 <0.7.0;

contract TestMsgValue {

  address owner;
  uint fee = 32 wei;
  event MsgValue(uint);
  event Tansfer(address from, address to, uint count);

//如果不提前声明合约为payable 那么remix构造函数时将不能使用value赋予价值
   constructor() public payable {
     owner = msg.sender;
     /* emit MsgValue(msg.value); */
  }

  function show() public payable returns (uint) {
    /* require(msg.value >= fee);
    owner.transfer(msg.value - fee); */
     emit MsgValue(msg.value);
    /* emit MsgValue(msg.value); */

  }
  function getBalance() public view returns (uint)  {
    return address(this).balance;
  }
  function transferValue(address getValueAddress, uint count) public  {
    emit Tansfer(address(this), msg.sender, count);
    msg.sender.transfer(count);
    getBalance();
  }

}

测试说明
  1. 如果不声明构造函数 payable 就会报错如下图
    在这里插入图片描述
    我暂时理解为----如果不将这个合约payable,那么合约在部署时,并不具有接受以太币的条件(感觉不太对)。
  2. 部署合约时,带入value值,只要调用合约函数,那么value自动进入合约地址,this.balance += value;
    对于这个霸道操作不是很明白,为什么只要运行函数,操作该合约就会将value加入合约!难道我设置value之后,调用函数也是message,相应value就是其附带的值嘛?
当前进度思考
  1. 如果部署到以太坊上,这个实际过程是怎么样的?
  2. 可以通过函数直接对合约账户充值嘛?
  3. 测试deposit函数
值得记录的一些语法
  1. 比较相同
    (1)abi.encode() …returns (bytes) 对给定参数进行编码
    (2)abi.encodePacked() returns (byetes) 更加精确的方法计算调用数据
    keccak256(abi.encodePacked(a, b)) 取代了keccak256(a, b);

  2. view 与event

如果函数声明为 view 类型,这种情况下要保证不修改状态。
		下面的语句被认为是修改状态:
		修改状态变量。
		**产生事件**。 ----view 限制符下 event会失效!!
		创建其它合约。
		使用 selfdestruct。
		通过调用发送以太币。
		调用任何没有标记为 view 或者 pure 的函数。
		使用低级调用。
		使用包含特定操作码的内联汇编。
  1. this直接用作地址报错 (sol 5.0)
Invalid type for argument in function call. Invalid implicit conversion from contract TestMsgValue to address requested.
emit Tansfer(this, msg.sender, count);

解决方法: 显示类型转换address(this)

再次更新 2020.2.23
  1. 不通过remix设置value,直接初始化一个含有固定数量wei的合约;

这是在官方文档上找到的,现在已经不能使用了;

pragma solidity ^0.4.0;

contract B {
    function B() public payable {}
}

contract A {
    address child;

    function test() public {
        child = (new B).value(10)(); //construct a new B with 10 wei
    }
}
基于solc 5.0的代码 测试通过
pragma solidity >=0.5.0 <0.7.0;

contract D {
    uint x;
    constructor(uint a) public payable {
          x = a;
      }
      function getX() public  view returns (uint) {
        return x;
      }
      function  getBalance() public  view returns (uint) {
        return address(this).balance;
      }
}

contract C {
    D d ;
    event getDAddress(D);
    /* event getBalance(uint); */
    constructor() public {
        emit getDAddress(d);
        d = new D(4); // 将作为合约 C 构造函数的一部分执行
        emit getDAddress(d);
    }

    function createD(uint arg) public {
        D newD = new D(arg);
        emit getDAddress(newD);
    }
    function createAndEndowD(uint arg, uint amount) public payable {
                //随合约的创建发送 ether
        D newD = (new D).value(amount)();
          emit getDAddress(newD);
    }

    function  getbalance(D _d) public view returns (uint) {
      return  _d.getBalance();
    }
    function getX(D _d) public view returns (uint) {
      return _d.getX();
    }
    function getBalance() public view returns (uint) {
      return address(this).balance;
    }
}

	(1)首先申明一个合约D变量,在部署C合约的时候,那么在部署C合约的时候,就会自动创建D合约实例对象
	(2)并且通过createAndEndowD函数传入参数,(转入合约D),这样D合约就会存放一定数量的wei
	(3)调用createAndEndowD函数时,预设置value值,(要不然会报错---没有存入,就不能转账)
	(4)通过getBalance()可以获取C合约的账户余额,通过getbalance()可以获取到D合约的账户余额(地址可以通过event事件获得)
  1. msg.value确实会出发命令将预设置的值传递进入合约;(remix环境中,预设置value值,下一条命令的执行就会将值转入合约内部) ---- 正式环境使用待补充
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

solidity学习过程---msg 的相关文章

随机推荐

  • MATLAB小技巧(14)三角函数作图

    MATLAB小技巧 14 三角函数作图 前言 一 MATLAB仿真 二 仿真结果 三 小结 前言 MATLAB进行图像处理相关的学习是非常友好的 可以从零开始 对基础的图像处理都已经有了封装好的许多可直接调用的函数 这个系列文章的话主要就是
  • win7/win10安装Ubuntu20.04双系统详细操作步骤

    0 磁盘分区 我的电脑 右键 管理 磁盘管理 选择一个盘 安装Ubuntu 我选的是F盘 右键 压缩卷 选择压缩大小 20G以上 1 Ubuntu安装包下载 方法一 官网下载20 04最新版本 URL https ubuntu com 方法
  • 数据库课程设计------书店管理系统

    书店会员管理系统 具体的效果图看博客 书店管理系统2 https blog csdn net qq 45981397 article details 124062654 spm 1001 2014 3001 5502 需求分析 1 信息需求
  • oracle游标双循环

    oracle双循环 循环资源表 T SYS RESOURCE 和角色表 T SYS ROLE 插入角色资源表t sys role resource declare a表游标定义 cursor a SYS RESOURCE cur is SE
  • 傻白入门芯片设计,史上最最最全DRAM介绍(十二)

    目录 1 DRAM单元阵列 1 1 DRAM基本单元 1 2 cell阵列 1 3 cell阵列的读取 1 4 DRAM刷新 2 DRAM芯片的读写 2 1 必须的周围逻辑 2 2 完整的读过程 重点 2 3 完整的写过程 2 4 时间消耗
  • javascript 数组一键乱序

    方法1 给数组原生的sort方法传入一个函数 此函数随机返回1或 1 达到随机排列数组元素的目的 const arr1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 const shuffleArray arr g
  • MAC机后端开发必备

    开篇 相信很多日常使用 MAC 进行软件开发的同学会有一种感受 在换 MAC 机的时候 拿到的都是一些裸系统 有一些常用必备的软件需要重新来安装一遍 我也遇到几次这样的问题 发现每次配置开发环境时都要安装这么几个方便好用的工具 在这总结一下
  • 获取url中的参数

    获取url 后的参数 location对象 含有当前URL的信息 属性 href 整个URL字符串 protocol 含有URL第一部分的字符串 如http host 包含有URL中主机名 端口号部分的字符串 如 www cenpok ne
  • 使用openssl_encrypt方法替代mcrypt_encrypt做AES加密

    mcrypt encrypt在php7 1中已被废弃 需要使用openssl encrypt代替 mdecrypt generic版 public function encrypt cbc str iv encryptKey module
  • java8中stream()的使用案例

    Test public void t1 List
  • VS2008中的 fatal error C1902: 程序数据库管理器不匹配

    因为VC Bin 下没有 msobj80 dll mspdb80 dll mspdbcore dll mspdbsrv exe 这四个文件 解决的方法 1 gt 直接从Common7 IDE 下复制这四个文件到VC Bin 下即可解决 2
  • Android-四大应用组件之Activity

    一 理论概述 Activity的理解 二 Intent和IntentFilter的理解 显示意图 当目标组件是当前应用的 则用显示意图 隐式意图 当目标组件是其他应用的 则用隐式意图 三 相关API 四 Activity的启动流程 通过Ac
  • 网络安全工具——Wireshark抓包工具

    文章目录 一 Wireshark抓包介绍 1 WireShark简介 2 WireShark的应用 3 WireShark抓数据包技巧 二 Wireshark抓包入门操作 1 常见协议包 2 查看本机要抓包的网络 3 混杂模式介绍 4 如何
  • stratascratch刷题1 salaries difference && Finding Updated Records

    1 解题 select select max salary from db employee join db dept on db employee department id db dept id where department mar
  • 接口测试的基础(网络传输知识与协议篇)

    接口测试的基础 测试人员对于接口测试的理解总是停留在工具使用层面 很多情况下 测试人员会花很大的 代价去学习一个工具 而测试工具本身的局限性 又导致测试人员陷入想直接用现成的测试框架 却又无法进行扩展的僵局 最后由于项目的特殊性等客观因素
  • ping命令中ICMP协议包的分析

    UDP收发以及所需要的ARP协议已经全部实现 接下来让咱们的协议栈支持ping 俗称能ping通 ping的请求和发送实际是ICMP协议的一个子集 ICMP可以参考ICMP数据包结构 Focus 新浪博客 在IP头中ICMP协议的标识是01
  • springboot项目读取 resource下面的json文件,并且解析

    在Spring Boot项目中 如果要读取src main resources目录下的JSON文件 可以使用ResourceLoader来加载文件 并使用Jackson库将JSON文件解析成Java对象 以下是一个简单的示例代码 impor
  • Type-C协议简介(CC检测原理)

    1 简介 越来越多的手机开始采用Type C作为充电和通信端口 Type C连接器实物和PIN定义如下图 目录 1 简介 Type C连接器中有两个管脚CC1和CC2 他们用于识别连接器的插入方向 以及不同的插入设备 本文介绍CC的基本识别
  • Bootrom概述

    1 Bootrom 是指on chip bootrom 在CPU芯片内部 内嵌有小的boot程序 bootloader 类似于PC机主板上的BIOS的存储区域 2 Bootloader怎么得到 如果对开发板有些改动 还能使用开发板的boot
  • solidity学习过程---msg

    solidity 5 0 remix测试 个人学习 欢迎指正 msg 研究了好一会 感觉还是有点困惑 msg sender 当前合约的调用者 1 部署合约的地址 2 调用该合约的地址 msg value 随消息发送的 wei 的数量 其实并