以太坊之部署智能合约
一、什么是智能合约
智能合约是存储在区块链上的一段代码,它们可以被区块链上的交易所触发,触发后,这段代码可以从区块链上读取数据或者向区块链上写入数据。
二、什么是Browser-solidity
Browser-solidity是一个官方提供的一个基于浏览器的合约编译器,非常好用,而且build版本会紧跟最新的Solidity的build版本。但由于网络原因以及GFW的存在,有可能会另一部分人访问很慢,进而影响开发效率。
Browser-solidity的地址:https://ethereum.github.io/browser-solidity
Browser-solidity工作区域介绍:
1.当前的solidity版本,如上图截图所示为0.4.9,这个默认用的是当前最新的release版本;新版本的solidify版本还有切换都是是在setting菜单下。
2.点击下拉框,可以选择不同的版本,包括还未成熟的最新构建版本,或者是之前的版本等。
3.点击create,会在内存中将该智能合约创建一个实例,即将下面的web3 deploy代码部署在虚拟的内存中。
4.bytecode是源代码的编译产物,这个也是最终会被放到区块链上的标识。任何在网络里的人都可以读到这段bytecode.
5.interface 是智能合约除了bytecode之外的另一个核心,他是该智能合约和外界沟通的核心
6.web3.deploy 代码,是可以直接部署在geth网络上的一段部署代码,在上一章中,我们已经试过了,只要复制黏贴这段代码,就可以直接在一个区块链私有链上进行部署,并且调用他。
7.from 代表合约由那个账户生成,那个账户生成,则生成所需的gas就需要该账户承担,默认为eth.accounts[0],因为所有的挖矿所得的以太币也默认都存入该账户中区。 data: 代表的就是bytecode gas: 代表的是为了部署该合约最多准备的gas数量,当然实际上可能用不了这么多gas,具体消耗以实际使用量为准,这里只是设定一个最大量。
8.最后这段是一个典型的javascript的异步调用的写法,将上面的new方法的结果传递给下一个方法 function(e,contract) 在下一个方法中处理如果挖矿成功的显示结果。
三、编辑源码
部署在Geth上的源代码如下:
3.1源码分析
pragma solidity ^0.4.0;contract Demo {function g(uint a) returns (uint b) {return a*a*2;}
}
第一行代码是必须的,否则编译器将不知道该如何选择编译器,以及编译器版本。
第一行的pragma solidity 中pragma是关键词,代表程序开始,solidity 代表本智能合约是由Solidity语言所撰写
0.4.9 代表的是编译器版本,注意:从0.4.9起可以在前面不打^,0.4.8/0.4.7等版本还是需要打^
编译器版本向下兼容;
第二行:
Solidity中Contract和面向对象语言中的类很相像。有带持久数据的变量,以及能改变这些变量的function. 在不同的Contract实例中调用一个function,将会执行一个在EVM(以太坊虚拟机)中的function调用。
由此可见,Solidity中的智能合约和传统面向对象语言中的类很相像,因此有构造函数,有继承,有变量,有function,也有抽象类等等传统概念。
由Solidity所写的智能合约,经过编译后就会由EVM来部署执行
Solidity语言是一种类JS的语言,因此很多编码规范和JS很相似
第三行:
function f(uint a) returns (uint b)
{
...
}
上面说过,contract中包含了变量&方法(function)。function f(uint a) returns (uint b) 代表定义了一个名为f的方法,输入变量为uint a, 输出为uint b
uint 代表无状态的整型数字,即大于0的整数
uint = uint256, 最大值为2的256次方,这个数字对于绝大多数的数学运算是足够得了。
相对于uint来说还有带负数的整数类型,即int, int=int256, 取值范围从 负2的128次方到正2的128次方
Function的核心代码:
function f(uint a) returns (uint b)
{
return uint result = a * a*2;
}
这是一段很平常的js代码,值得注意的是以下两点
Solidity是一个类型语言,因此每个变量都需要定义他的类型,uint/int/string/var
关于编码风格 uint result = a * 8;, solidity 鼓励在操作符中有一个空格。如下:
x = 1;
y = 2;
long_variable = 3;
3.2这个时候在这个地址的左侧,复制黏贴上述的代码,然后就可以看到右侧编译好的代码:
1.这个时候点击红色 Create按钮,会在内存中将该智能合约创建一个实例,即将下面的web3 deploy代码部署在虚拟的内存中。
2.Trasaction/Execution Cost: 这个代表Create一个合约所消耗的成本,单位为Gas。Gas和Ether币有一个兑换关系,兑换比例由Oracle决定
3.这里可以看到我们的合约名称browser/first.sol:demo, 注册在了一个地址上面。这个代表该合约已经被挖矿出来了。
4.第三个就是我们上方的合约代码,g(n) {return 2*n * n}
5.这个时候我们输入3,然后点击f按钮,我们可以看到结果18,符合预期,执行f()这个function消耗的Gas Cost是21693+229
四、部署合约
4.1我们在命令行中,首先unlock(cc0),因为部署合约需要消耗gas,也就是以太币。而之前说过由于保护机制,不解锁账户,是不会允许任何以太币流出的。
4.2然后我们复制黏贴下面代码到geth 命令行中。
4.3等待片刻,会发现合约被部署到挖矿挖出来的区块中了, 按下回车代表成功
4.4此时输入合约部署的实例a_demotypes, 可以看到a_demotypes的详情。
4.5也可以调用a_demotypes的方法g, 输入任何数字,会返回n*n*2,如输入3,返回18
以太坊之部署智能合约相关推荐
- 基于以太坊网络的智能合约开发、部署和测试(入门)
为什么80%的码农都做不了架构师?>>> 基本概念: 以太坊是一个开放的.公开的区块链平台,允许用户构建自己的去中心化应用在上面运行 Solidity是一种语法类似JavaSc ...
- 元宇宙应用开发实例——以太坊里的智能合约和Decentraland里的3D前端交互组件
目录 1. 元宇宙核心技术 2. 元宇宙实例及应用实例 3. 以太坊里的智能合约开发 3.1. World Wide Web的访问能力 3.2. 初始化以太坊钱包 3.3. 开发4方合约 3.4. 手 ...
- 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
比特币开发者Udi Wertheimer发推称,我觉得这是以太坊作为顶级智能合约平台的最后一个周期了. 昨天币安智能链(BSC)结算500万ETH,以太坊本身结算700万ETH左右.这可能会很快结束. ...
- 以太坊可更新智能合约研究与开发综述
原文地址:https://ethfans.org/posts/ethereum-upgradeable-smart-contract-strategies 这篇文章是对以太坊可更新智能合约领域里的研究 ...
- 以太坊—开放的智能合约完整解决方案
什么是以太坊(Ethereum)? 通俗的讲,以太坊是一种新的法律.传统的合同合约依据法律订立,执行.违约处理依赖律师.法院:以太坊解决了这一系列问题,合约通过程序订立.执行,人工无法干预,所以几乎可 ...
- 区块链入门文章二《以太坊:下一代智能合约和去中心化应用平台》
以太坊:下一代智能合约和去中心化应用平台 以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有 ...
- 3.25 以太坊:实战智能合约众筹1
这次我们来看看怎么实现以太坊的众筹智能合约案例,首先我们了解一下下面的概念 1.什么是ICO? ICO是以初始产生的数字加密货币作为投资回报的一种筹措资金的方式,它的概念源自证券界的Initial ...
- 附录2 以太坊:下一代智能合约和去中心化应用平台(选译)
以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有资产担保或内生价值[1],也没有中央发行者 ...
- 以太坊:下一代智能合约和去中心化应用平台
以太坊基金会 著 李志阔(网名:面神护法) 赵海涛 焦锋 译 中本聪2009年发明的比特币经常被视作货币和通货领域内一次激进的发展,这种激进首先表现为一种没有资产担保或内生价值[1],也没有中央发行者 ...
最新文章
- LeetCode简单题之统计匹配检索规则的物品数量
- 项目部署时网关怎么回事_使用Kubernetes部署聊天网关(或技术按预期运行时)...
- TensorFlow + Docker + PyCharm
- 山东师范大学计算机尹副教授,我校举办首届优秀教案展评工作
- xml可以html标签吗,自定义html标签(XML)
- 对称密钥加密算法 对称轮数_选择Java加密算法第2部分–单密钥对称加密
- 开氏温度与摄氏度换算_【油品小知识】你不知道的“柴油密度”与“温度”的故事...
- pytorch torch.arange
- Java关键字break、return、continue
- matlab netcdf,Matlab读取Netcdf文件
- 如何在SQL Server数据库中删除角色
- sigprocmask系统调用
- Android 8.0 Oreo 来啦!
- Unity AssetBundle 资源(纹理,网格,动画,字体,LightMap,音频等)使用 优化
- SPSS 26下载与安装
- 定积分的基本性质5 区间可加性
- kettle carte子服务器的使用
- 存储过程和触发器-LOGON/LOGOFF触发器
- 一个简单的CD唱片管理程序
- 机械键盘和普通键盘打字哪个舒服
热门文章
- windows10 使用小技巧
- 关于 find grep xargs 命令总结
- 新手如何循序渐进学习3dmax室内设…
- EasyAR 开发技巧----截屏
- 传奇服务器维护活力值怎么算,怎么办啊请问那个活力值是怎么搞的,我的活力 – 手机爱问...
- CF1674 F. Desktop Rearrangement(二维转一维, 模拟)
- 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)
- BCM VOIP 启动分析
- 像素鸟简单的背景设置_01
- 生活服务app的开发优势