加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在以太坊上部署和运行智能合约大致流程

(2017-11-14 01:45:58)
标签:

以太坊

智能合约

分类: 加密货币和区块链
在以太坊上部署和运行智能合约大致流程

step1:   启动一个以太坊节点(如Geth)
step2:使用智能合约编程语言(如Solidity)编写智能合约(后缀为.sol)
step3:   用solc编译器将.sol合约代码编译成EVM字节码
step4:将编译好的合约代码部署到以太坊区块链需要消耗GAS,并且需要合约发起用户使用自己的外部所有账户对将要部署的合约进行签名,通过矿工确认后,将合约代码存于以太坊区块链上。在这一步中,用户可获得合约的地址,以及调用合约所需的接口,以便之后使用。

ps:1、合约地址和合约接口(ABI)是找到合约并调用合约的必要信息。
       2、在以太坊上创建(或部署)一个合约是通过发送一个交易完成的。

step5:使用web3.js库所提供的JavaScript API接口来调用合约。这一步也会消耗以太币。

以太坊中miner的职责有:接收(receive)、验证(verify)、传播(propagate)和执行(execute)交易(ps:执行交易主要是调用合约交易)。当然还有接收区块,验证区块,传播区块。这些职责都是诚实矿工做的,理性矿工可能只是产生区块。


Q:智能合约的数据存在哪里的?

智能合约的数据(状态变量)存在区块链上。

Q:调用合约传进来的参数存在哪里?

参数不一定,参数如果用的是栈那就不存,默认的栈不是memory类型

数据位置,变量的存储位置属性。有三种类型,memory(内存)storage(持久化到硬盘上)calldata

最后一种数据位置比较特殊,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata(大多数表现和memory一样)。这种数据位置是只读的,不会持久化到区块链(即leveldb中)。

一般我们可以选择指定的是memory和storage。

memory存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收。

而对于storage的变量,数据将永远存在于区块链上(持久化到硬盘上)。

memory就相当于栈的数据。可以把栈里的元素放到storage位置和memory位置

一个合约里的局部(local)变量状态(state)变量都存在链上,即持久化到leveldb中了。

深入分析

storage 存储结构是在合约创建的时候就确定好了的,它取决于合约所声明状态变量。但是内容可以被(交易)调用改变(所有的节点修改一样)

Solidity 称这个为状态改变,这也是合约级变量称为状态变量的原因。也可以更好的理解为什么状态变量都是storage存储。

memory 只能用于函数内部,memory 声明用来告知EVM在运行时创建一块(固定大小)内存区域给变量使用。

storage 在区块链中是用key/value的形式存储,而memory则表现为字节数组

关于栈(stack)

EVM是一个基于栈的语言,栈实际是在内存(memory)的一个数据结构,每个栈元素占为256位,栈最大长度为1024。

值类型的局部变量是存储在栈上。

不同存储的消耗(gas消耗)

storage 会永久保存合约状态变量,开销最大
memory 仅保存临时(temporary)变量,函数调用之后释放,开销很小
stack 保存很小的局部变量(small local variables),几乎免费使用,但有数量限制。

合约storage是以太坊帮我们实现好了。开发者只需要根据合约地址和ABI调用合约的函数就行。

以太坊里面的合约有点像服务端程序,业务调用合约的接口就是了。

交易数据存储在区块链上,账户的状态数据存储在本地;区块只保存该区块最终实现的账户状态的默克尔根。

部署交易的时候只需要携带合约的EVM字节码。当合约源程序比较大,相应的二进制码也会很大。

用户发送特定的交易(该交易被存储在某一区块里),部署合约到以太坊上,最后生成的合约地址(每一个合约地址对应一个合约账户,即内部账户)是所有的以太坊节点都有。
合约账户只存合约的以太坊虚拟机字节码(一种以太坊专用的的二进制格式)。)

合约账户可以存储以太币;存储智能合约的可执行字节码;可响应别的用户或合约执行此智能合约的请求,并返回结果;可调用别的智能合约。

Q:为什么比特币这些项目喜欢用leveldb?是有哪些工程上的考量吗?

每个节点全量备份只能考虑嵌入式数据库。嵌入式数据库只有leveldb,rocksdb,sqlite。

参考材料:

https://solidity.readthedocs.io/en/v0.4.21/types.html#reference-types

http://solidity.readthedocs.io/en/latest/frequently-asked-questions.html (官方FAQ)

https://blog.csdn.net/liyuechun520/article/details/78408588

http://me.tryblockchain.org/solidity-data-location.html

https://www.cnblogs.com/tinyxiong/p/8084477.html (分析得比较深刻)

https://segmentfault.com/a/1190000013791133?utm_source=tag-newest


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有