1. 程式人生 > >solidity智慧合約[5]——一筆交易詳解

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

image.png