一、以太坊 智能合约的运行原理
1. 智能合约
智能合约是一种特殊协议,旨在提供、验证及执行合约。
具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。
在以太坊,记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。
2. 开发步骤
step1: 启动以太坊节点
启动一个以太坊节点(如Geth)
step2:编写
使用智能合约编程语言(如Solidity)编写智能合约(后缀为.sol)。
可以将一个智能合约实例理解成一个对象,编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。
这里给出一个简单的例子。下面这段代码就是一个智能。合约SimpleStorage,里面只有一个变量storedData,以及set和get方法。
contract SimpleStorage {
string storedData;
function set(string s) {
storedData = s;
}
function get() constant returns (string) {
returnstoredData;
}
}
step3: 编译
用solc编译器将.sol合约代码编译成EVM字节码。
step4:部署
通过以太坊客户端将编译好的合约代码上传部署到以太坊区块链需要消耗GAS,并且需要合约发起用户使用自己的外部所有账户对将要部署的合约进行签名,通过矿工确认后,将合约代码存于以太坊区块链上,即智能合约被发送到所有连接到网络的设备上。在这一步中,用户可获得合约的地址,以及调用合约所需的接口,以便之后使用。
图1-4展示了在以太坊网络中创建智能合约的过程。
当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的“0x6f8ae93..”代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。
当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。
step5:调用
使用web3.js库所提供的JavaScript API接口来调用合约。这一步也会消耗以太币。
当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。
无论发布还是调用智能合约,智能合约的信息都被附在“交易”中,以交易的形式发布到网络中。
因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致
图1-5展示了在以太坊上调用智能合约的过程。
Bob同样以交易的形式在“To”字段填上SimpleStorage合约的地址,在“Data”字段填上调用的方法(set)和参数(“Hello”),就可以调用智能合约SimpleStorage,将其中的storedData设为“Hello”。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。
之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了“Hello”。
由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。
--《以太坊技术详解与实战》
- a、合约地址和合约接口(ABI)是找到合约并调用合约的必要信息。
- b、在以太坊上创建(部署)、调用一个合约是通过发送一个交易完成的。
3. 太坊虚拟机EVM
以太坊虚拟机(EVM)是以太坊上智能合约的运行环境。
每个以太坊节点都运行着EVM。
它实际上是完全隔离的,这意味着在EVM上运行的代码无法访问网络、文件系统和其他进程。
智能合约对其他的智能合约的访问权也有限,在区块链网络上单独运作。
4. 矿工的职责
以太坊中miner的职责有:- 接收(receive)交易
- 验证(verify)交易
- 传播(propagate)交易
- 执行(execute)交易(ps:执行交易主要是调用合约交易)。
- 接收区块,
- 验证区块,
- 传播区块。
5. 智能合约的数据存在哪里的?
智能合约的数据(状态变量)存在区块链上。6. 调用合约 传进来的参数存在哪里?
参数不一定,参数如果用的是栈那就不存,默认的栈- memory(内存)
- storage(持久化到硬盘上)
- calldata。
7. 深入分析
storage 存储结构是在合约创建的时候就确定好了的,它取决于合约所声明状态变量。但是内容可以被(交易)调用改变(所有的节点修改一样)。 Solidity 称这个为状态改变,这也是合约级变量称为状态变量的原因。也可以更好的理解为什么状态变量都是storage存储。 memory 只能用于函数内部,memory 声明用来告知EVM在运行时创建一块(固定大小)内存区域给变量使用。 storage 在区块链中是用key/value的形式存储,而memory则表现为字节数组8. 关于栈(stack)
EVM是一个基于栈的语言,栈实际是在内存(memory)的一个数据结构,每个栈元素占为256位,栈最大长度为1024。 值类型的局部变量是存储在栈上。9. 不同存储的消耗(gas消耗)
- storage 会永久保存合约状态变量,开销最大
- memory 仅保存临时(temporary)变量,函数调用之后释放,开销很小
- stack 保存很小的局部变量(small local variables),几乎免费使用,但有数量限制。
10. 为什么比特币这些项目喜欢用leveldb?是有哪些工程上的考量吗?
每个节点全量备份只能考虑嵌入式数据库。嵌入式数据库只有leveldb,rocksdb,sqlite。
在以太坊上部署和运行智能合约大致流程
http://blog.sina.com.cn/s/blog_a93b83380102zb9z.html#cmt_5AAB2321-CA787956-167D58BCD-927-8FE
智能合约这么火,但是你连它的执行原理都不知道?
https://www.sohu.com/a/260072502_100271565
去中心化的区块链平台
https://www.sohu.com/a/243362789_797635/
二、以太坊 智能合约的开发实例
- 使用案例:保险流程中的智能合约
- 智能合约的好处
- 安装先决条件
- 配置Genesis Block
- 运行以太坊专用网络
- 创建以太坊帐户
- 创建以太坊智能合约
- 执行以太坊智能合约
https://www.jianshu.com/p/69237f98d43d?from=singlemessage
什么是智能合约,智能合约运作原理详解
https://www.jianshu.com/p/884df9fb6767
标签:调用,以太,智能,实例,memory,区块,合约 来源: https://blog.51cto.com/u_15077160/2914386
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。