美文网首页
solidity 以太坊编程学习 --智能合约概述

solidity 以太坊编程学习 --智能合约概述

作者: 想成为dalao的菜鸡 | 来源:发表于2020-03-26 22:07 被阅读0次

学习solidity需要有区块链相关基础

区块链基础

交易(transaction)

区块链是一个分布式的数据库,每个用户都可以加入区块链网络来阅读数据库中的数据。用户通过交易来获取/更改区块链内的内容。每次交易都由发起人对交易进行数字签名,来确定交易的发起者。

区块

区块链要解决的一个首要问题被称为“双花攻击”:如果一个账户对另外两个账户发起转账(交易),同时发送完自己所有的余额会怎么样?这是否就导致了一块钱当成两块钱花的危险?在区块链中,数据库是由一连串根据时间顺序生成的区块连接成的链(类似于链表),交易被记录在块中。区块链网络会自动选择交易序列打包成块链接到区块链的后面,当两笔交易发生冲突(如双花)时,被认为是后发生的交易将会被拒绝,不会被加到区块内。也就是说:你同时用同一块钱付给两个人,区块链会承认他先收到的那笔交易,拒绝后收到的交易,那么后一个人就不会收到这一块钱。

以太坊虚拟机

概述

以太坊虚拟机(EVM)是智能合约运行的环境。以太坊虚拟机不仅仅是沙盒封装的,而且是完全隔离的,即在EVM中运行的代码无法访问网络,文件系统和其他进程,甚至和其他合约之间的访问也是受限的。

账户

在以太坊中有两钟账户:用户账户和合约账户,用户账户由公私钥控制,而合约账户由和账户一起存储的代码控制。用户账户的地址由公钥(公钥的后20个byte)决定,而合约账户的地址由创建合约时创建者的地址从该地址发出过的交易数量计算得到。 用户账户和合约账户对于EVM来说没有什么区别。

存储:每个账户都有一个键值对形式的持久化存储,key和value都是256bit,称为存储

交易

交易可以看作是一个账户发送到给另一个账户的消息(第二个账户可以是普通账户,也可能是自己本身,也可以是零账户),这个信息内容可以是包含以太币二进制数据

若目标账户拥有代码,则代码会被执行,消息内容将会以payload的形式作为传入参数。若目标账户是零账户,则会创建新合约,创建合约的payload会被转换成EVM字节码并执行,执行完的输出作为合约代码存储到区块链上。我们可以得出,我们编写的代码并不是生成合约的代码,而是能够生成合约代码的代码

Gas

每笔交易都会收取一定的gas,作为交易的手续费。EVM在执行交易的时候,会慢慢的使用gas。

gasprice(指的是一个gas的价格  wei / gas),gasprice在用户发送交易时由用户设定,手续费 = gasprice * gas 若交易执行完,gas还有剩余,则会原路返回给交易发送方。 交易在执行过程中,若gas被消耗殆尽,则所有执行过的修改过程就会被回滚,gas返回(你的钱不足以购买这个服务)。

存储,内存和栈

每个账户都有一个持久化的内存区叫做存储,它是将256位 映射到256位的键值存储区。

内存:合约会试图为每一次信息调用获取一块被初始化的内存实例,内存读的长度被限制为256位,写的长度可以为8位或者256位,当访问之前未访问过的内存字时,内存将按字进行扩展,然后收取一定的gas。随着内存使用量的增长,其费用也会增高。

:EVM是基于栈的,因此所有计算都在栈内执行。栈最大由1024个元素,每个元素的长度是一个字(256bit)。

看到这里我对以太坊虚拟机已经不太理解了,很懵,等到懂了再回来继续更。

相关文章

网友评论

      本文标题:solidity 以太坊编程学习 --智能合约概述

      本文链接:https://www.haomeiwen.com/subject/bkrosqtx.html