solidity智能合约[5]——一笔交易详解

在之前,我们已经写好了一个最简单的helloworld合约,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pragma solidity ^0.4.23;
contract HelloWorld{
string public name = "jonson";

function getName() public view returns(string){
return name;
}

function changeName(string _name) public{
name = _name;

}

function testPure(uint a,uint b) public pure returns(uint){
return a+b;
}
}

和pure和view不同,当我们执行changeName方法时,会发现,我们需要消耗gas。这笔事务会发送给全网所有的节点。全网所有的节点都会执行同样的操作。
当我们调用函数会在remix控制台中显示一些信息。

一笔交易的信息详解:

控制台信息

其中:
  1、statues:代表当前交易状态,是否提交到区块链中成功。
  2、transation hash:唯一标识此交易。
  3、from:调用者地址。
  4、to:合约地址
  5、gas:此交易gas的最大限制
  6、transation cost:此交易花费的总gas的大小。包含了excution cost。例如一笔交易基本的cost为21000gas。部署合约最小的成本为32000gas
  7、excution cost:交易的执行成本。特指在以太坊虚拟机中运行的成本。
  8、hash:同transation hash。
  9、input 调用函数、传递进以太坊虚拟机中的二进制代码。
  10、decode input 构造函数输入。
  11、函数返回值
  12、log 事件信息存储在其中
  13、value 交易附带的以太币。

input详解

对于此例来说,如果我调用changeName传递的参数为"olaya",那么input中的信息为:

input

1、0x5353a2d8前4个字节,是函数声明hash后的前4个字节,用于查找到函数的位置。
2、0000000000000000000000000000000000000000000000000000000000000020第一个参数的偏移量,0x20是10进制的32,代表olaya这个参数偏移了32个字节。
3、0000000000000000000000000000000000000000000000000000000000000005string是特殊的动态长度数组,前面需要有长度来标示占了几个字节,扩充到32个字节。
4、6f6c617961000000000000000000000000000000000000000000000000000000olaya16进制标示,扩充到32个字节。。

参考资料:
transation cost and excution cost