1、智能合约是什么

  智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。

  智能合约可以调用其他智能合约,这开启了创造一个自主代理的能力,这些代理可以自己进行交易。
  

 

2、用户账户和合约账户

image-1667202095410

用户帐户有:

  • 地址(有点像我们的银行帐号 - 比特币也有同样的概念)
  • 余额(我有多少钱: 以太)

智能合约账户有:

  • 地址
  • 余额(有多少钱: 以太)
  • 状态(智能合约中声明的所有变量和变量的当前状态)
  • 代码

地址是帐户的唯一标识符,与常规用户帐户一样。

  合约用户中有智能合约代码,与个人帐户不同,它可以“主动操作”将交易发送给其他人。因此,如果我们想要使用智能合约的功能,我们必须在个人账户中发送“接收地址作为合同”。 “地址”交易,主动触发合同,让合同执行行动。 因此,任何交易的起点必须是个人账户。

 

3、智能合约部署过程

1.开发人员用Solidity写完成合同

2.源代码编译为字节码

3.输入交易的输入数据

4.接收地址部分留空(0x0)

5.确定节点(矿工)将合同发送到链

6.矿工执行和部署链以生成智能合约 合同有自己的“合同地址”,永久在链上。

 

​ 智能合约是部署在区块链的代码,区块链本身不能执行代码,代码的执行是在本地的EVM中,实际上,部署在区块链上代码是能够在本地产生原智能合约代码的代码,可以理解区块链为一个数据库,而客户端从数据库中读取了存储的运行代码,并在本地运行后,将结果写入到了区块链这个数据库中。

 

4、智能合约调用过程

image-1667202148071

5、以太坊的交易类型

以太坊与比特币很大的不同是其交易还有一个DATA字段。 DATA字段支持三种类型的交易:

  • 价值传递 (和比特币相同)
    • TO :收款地址
    • DATA :留空或留言信息
    • FROM :谁发出
    • AMOUNT :发送多少
  • 创建合约
    • TO :留空 (这就是触发创建智能合约的原因)
    • DATA :包含编译为字节码的智能合约代码
    • FROM :谁创建
    • AMOUNT :可以是零或任何数量的以太,它是我们想要给合约的存款。
  • 调用合约函数
    • TO: 目标合约账户地址
    • DATA: 包含函数名称和参数 - 标识如何调用智能合约函数
    • FROM :谁调用
    • AMOUNT : 可以是零或任意数量的以太,例如可以支付合约服务费用。

5.1 价值传递

{
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
    value: 0.0005
    data: ‘0x’ // 也可以附加消息
}

非常简单,就是转移一定数量的以太到某个地址,如果我们愿意也可以向交易添加消息。
 

5.2 创建智能合约

{
    to: '',
    value: 0.0
    data: ‘0x6060604052341561000c57xlb60405160c0806……………’
}

 
如上所述,TO为空表示创建智能合约,DATA包含编译为字节码的智能合约代码。

5.3 调用合约方法

{
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85’, //合约
    value: 0.0
    data: ‘0x6060604052341561000c57fe5b60405160c0806……………’
}

 

6、代币(Token)

数字代币代表区块链总账上的记账权

 

代币的作用

一个区块链项目往往就是一个程序,而且是开源程序。免费的开源程序没人干,必然需要商业利益驱动。代币数量往往是有限的,需求增加,代币则会增值。为了让代币增值,开发者就必须不断完善及优化相关技术;而每个使用该区块链网络服务的用户,则需要向以太坊矿工支付一定费用,以激励其继续参与整个网络的维护。

以太坊的代币:以太币(ETH)

  • 作为一种燃料。以太坊用户运行以太坊的智能合约需要“消耗”对应的以太币。消耗指的是支付给了维持以太坊网络的矿工。
  • 同样具备货币这样的支付属性。
  • 也同样可视作为持有以太坊这种”世界计算机“的股票。

ETH和Gas的关系:以太网每天的Gas价格不同,因此两者之间的转换率也不同。

 

7、ERC20标准

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

  ERC20标准以太坊上的一个代币协议,所有基于以太坊开发的代币合约都遵守这个协议。

  1. name
function name() constant returns (string name) 

返回string类型的ERC20代币的名字,例如:StatusNetwork

  1. symbol
function symbol() constant returns (string symbol)

返回string类型的ERC20代币的符号,也就是代币的简称,例如:SNT

  1. decimals
function decimals() constant returns (uint8 decimals)

支持几位小数点后几位。如果设置为3。也就是支持0.001表示。

  1. totalSupply
function totalSupply() constant returns (uint256 totalSupply)

发行代币的总量,可以通过这个函数来获取。所有智能合约发行的代币总量是一定的,totalSupply必须设置初始值。如果不设置初始值,这个代币发行就说明有问题。

  1. balanceOf
function balanceOf(address _owner) constant returns (uint256 balance)

输入地址,可以获取该地址代币的余额。

  1. transfer
function transfer(address _to, uint256 _value) returns (bool success)

调用transfer函数将自己的token转账给_to地址,_value为转账个数

  1. approve
function approve(address _spender, uint256 _value) returns (bool success)

批准_spender账户从自己的账户转移_value个token。可以分多次转移。

  1. transferFrom
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

与approve搭配使用,approve批准之后,调用transferFrom函数来转移token。

  1. allowance
function allowance(address _owner, address _spender) constant returns (uint256 remaining)

_spender返回仍然允许从_owner提取的金额。

  • 账户A有1000个ETH,想允许B账户随意调用100个ETH。
  • A账户按照以下形式调用approve函数approve(B,100)
  • 当B账户想用这100个ETH中的10个ETH给C账户时,则调用transferFrom(A, C, 10)
  • 这时调用allowance(A, B),可以查看B账户还能够调用A账户多少个token。

 
参考链接:
https://zhuanlan.zhihu.com/p/206910261
 
如有不对,烦请指出,感谢~