博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以太坊代币开发智能合约solidity的奥秘
阅读量:6810 次
发布时间:2019-06-26

本文共 3624 字,大约阅读时间需要 12 分钟。

想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】链客,有问必答!!

在上一章中部署在Geth上的源代码如下: 

    pragma solidity 0.4.9; 

    contract DemoTypes { 
        function f(uint a) returns (uint b)  
        { 
            uint result = a * 8; 
            return result; 
        } 
    } 
这个时候在这个地址的左侧,复制黏贴上述的代码,然后就可以看到右侧编译好的代码: 
p1 

复制黏贴这段代码,且web3.eth.accounts[0]也处于解锁状态的话,即可部署到以太坊的私有链上。并可以被执行和调用。 

p2 

a_demotypes.f.call(100) 
800 
a_demotypes.f.call(125) 
1000 
  

智能合约Solidity 源代码分析 

  

这个最简单的智能合约代码如下: 

    pragma solidity 0.4.9; 

    contract DemoTypes { 
        function f(uint a) returns (uint b)  
        { 
            uint result = a * 8; 
            return result; 
        } 
    } 
我们接下来试着做一些简单的分析,并介绍一些最基本的Solidity知识 
第一行 

  pragma solidity 0.4.9; 

第一行代码是必须的,否则编译器将不知道该如何选择编译器,以及编译器版本。 
第一行的pragma solidity 中pragma是关键词,代表程序开始,solidity 代表本智能合约是由Solidity语言所撰写 
0.4.9 代表的是编译器版本,注意:从0.4.9起可以在前面不打^,0.4.8/0.4.7等版本还是需要打^ 
编译器版本向下兼容, 
p3 

第二行 

contract DemoTypes { 

       ... 
    } 
这里引用一段说明Solidity里的Contract 

Contracts in Solidity are similar to classes in object-oriented languages. They contain persistent data in state variables and functions that can modify these variables. Calling a function on a different contract (instance) will perform an EVM function call and thus switch the context such that state variables are inaccessible. (引用自 here) 

中文翻译: 

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次方 
uint/int类型细节请参见后面的Int类型介绍。或者点击here 
Function的核心代码 

function f(uint a) returns (uint b)  

        { 
            uint result = a * 8; 
            return result; 
        } 
这是一段很平常的js代码,值得注意的是以下两点 
Solidity是一个类型语言,因此每个变量都需要定义他的类型,uint/int/string/var 
Solidity is a statically typed language, which means that the type of each variable (state and local) needs to be specified (or at least known – see Type Deduction below) at compile-time. Solidity provides several elementary types which can be combined to form complex types. 引用自here 
关于编码风格 uint result = a * 8;, solidity 鼓励在操作符中有一个空格。 
More than one space around an assignment or other operator to align with 引用自here 
Yes: 

x = 1; 

y = 2; 
long_variable = 3; 

经过上面的代码,我们知道了关于智能合约的一些基础知识,下篇将开始讲解Browser-solidity右侧的奥秘 

Browser-solidity是一个官方提供的一个基于浏览器的合约编译器,非常好用,而且build版本会紧跟最新的Solidity的build版本。但由于网络原因以及GFW的存在,有可能会另一部分人访问很慢,进而影响开发效率。下面介绍如何在本地部署Browser-solidity 

  

本地部署Browser-solidity方法 

  

Step 1: 将源代码下载到本地,并解压缩 

p4 

Step 2: 到下载下来的文件夹下,执行下面命令(基于源代码进行build) 

npm install    # fetch dependencies 
npm run build  # build application into build/app.js 
Step 3: 启动npm 服务器 
npm run serve 
p5 

本地打开效果如下:然后就可以随意的撰写自己的智能合约了。 

p6 

  

Browser-solidity 细节详解 

  

这里用到的Browser-solidity是官网的,如果打不开或者速度太慢,请参照上面的本地搭建方法。 

Browser-solidity的右侧详细解析,请参看下图: 

p7 

1.当前的solidity版本,如上图截图所示为0.4.9,这个默认用的是当前最新的release版本。 

2.点击下拉框,可以选择不同的版本,包括还未成熟的最新构建版本,或者是之前的版本等。 个人强烈建议,尽量选择release版本,如下图所示的这些 
p8 

3.点击create,会在内存中将该智能合约创建一个实例,即将下面的web3 deploy代码部署在虚拟的内存中。 

p9 

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) 在下一个方法中处理如果挖矿成功的显示结果。 
到这里为止,我们已经详细剖析了一个最简单的智能合约,以及以太坊的一些底层技术细节。

转载地址:http://uhqwl.baihongyu.com/

你可能感兴趣的文章
yarn管理命令
查看>>
SSH KEY免密码验证
查看>>
我的友情链接
查看>>
客户端判断是否为IE9以上版本
查看>>
newusers和chpasswd的用法
查看>>
电信商务领航1-1端口映射即虚拟服务器
查看>>
关键字AUTO_INCREMENT 重命名表 修改列的属性。
查看>>
fastreport(B)
查看>>
伪造邮件***,社工钓鱼,你中招了吗【一】
查看>>
Context 使用不当造成内存泄露
查看>>
C#双缓冲机制
查看>>
12.17 Nginx负载均衡;12.18 ssl原理;12.19 生产ssl密钥对;12.20 N
查看>>
P2P概览与原理解析
查看>>
zabbix监控端口状态
查看>>
搭建电子邮件系统
查看>>
php检测函数是否存在函数 function_exists
查看>>
登陆界面上下左右居中自适应屏幕显示的简单实现
查看>>
【解决】Windows Mobile 6 Professional SDK Refresh.msi 在xp上一直卡死
查看>>
RH124 Chapter 2 Managing Files From the Command Line
查看>>
内核里面writel(readl)是如何实现的
查看>>