以太坊智能合约开发:让合约接受转账

伙伴们,我们今天分享的内容是关于如何写以太坊智能合约的知识。

在以太坊智能合约开发中,通常会有向合约地址进行转账的需求,那么有几种向合约地址进行转账的方式呢?

有三种方式:

部署合约时转账

调用合约提供的方法

直接向合约地址进行转账

但有一个问题,以太坊的智能合约默认是拒绝来自任何地址的转账,那么如何让合约能够支持接收转账呢?

1、部署转账

在进行合约开发时,如果想要在部署时,直接向该合约进行转账,只需要给构造函数中添加payable修饰符。

示例:

contract Test {

      // 构造函数添加payable修饰符即可

      function Test() payable {

        // 构造函数其他逻辑代码 

    }

}

2、执行合约转账

执行合约转账,则需要给你需要支持转账功能的方法添加payable修饰符

示例:

contract Test {

      function getBalance() payable {

        // 其他逻辑

    }

}

3、直接转账

支持直接转账,需要借助后备函数(fallback function),只需要为后备函数添加 payable 修饰符

示例:

contract Test {

      function () payable {

        // 其他逻辑

    }

}

作者:中v中
链接:https://www.jianshu.com/p/431ef742bd00
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

在solidity中写的智能合约类似面向对象编程语言中的类。每个合约中包含注释注解、路径、语法、状态变量、函数、函数修饰器、事件、结构类型和枚举类型,合约可以继承。

前几天分享了几个简单智能合约,大家有了初步印象,今天就说说里面的一些知识点。

智能合约开始的第一行,都是告知编译器如何编译和标注版本号。

格式范例:pragmasolidity^0.4.0;

其中0.4.0是标注编程所用solidity的版本号,用哪个版本,写那个版本号。

pragma是pragmaticinformation的简称,solidity沿用c、c++编程语言中的编译指令概念,用于告知编译器如何编译。

为了方便维护等作用,编程代码需要注释,注释一行能写完的,用符号://

多行的注释用

/*

  注

     释

     内

     容  */显示;

状态变量,是永久的存储在合约存储器中的值。

Uint,无符号256位整数,其中,int,是有符号整数。uint=un+int,无符号整数,符号就是正负的意思,表示是个正的,没有负数,就是转移以太坊给别人,智能转0到很多个比特币,却不能转-5个比特币。

uint,是用来说明定义的数值是无符号256位整数。

uint8,是说明定义的数值是无符号8位整数。同样,uint16,uint32啥的等,都是说明数值范围。

bool,这也是常见的类型,就是返回true或者false。比如收到代币、投票成功等,就返回true。如果失败,就返回false。

!是否定。 

&& 是和同时的意思。

|| 是或者。 

== 等于。

!=不等于。

address,是常用的,代表以太币地址的数值。需要接受、返回、记录以太币地址时,就要用这个来定义。

函数,是智能合约里可执行的一组代码。  形式是:function   —– {——}。

事件:合约中常见的,是与以太坊虚拟机日志工具的方便借口,用于将各种数据传输到日志上,方便查阅。用Event来声明。形式是:event ——–(—);

比如:钱包收到代币、代币转走、投票成功等等,都可以通过事件,自动统计通知到日志里,方便你想知道的事件的通知。

结构类型: 将几个变量分组的自定义类型。用struct定义。 比如要定义投票人的年龄钱包地址 是否投票:

struct voter {

uint  old

bool  voted

address delegate

}

导入语句:import,用来导入各种编程语句。

import “别的智能合约名字”;就可以导入别的智能合约所有的全局符号。

import *

assymbolname friom “别的智能合约的名字”;

import

“别的智能合约的名字”assymbolname;

这两句代码意思一样,都是全部复制”别的智能合约的名字” 中的全局符号来创建一个新的全局符号 symbolname。

编写智能合约时,要注意路径。一个实心小圆点 . 代表当前目录,两个实心小圆点 .. 代表上一层的更大的父目录。

/是目录分隔符。  ./  当前目录。 ../父目录。

import “./x” asx;这个是导入当前源文件同目录下的文件x。

import “../x”as x;这个是导入当前文件父目录下的文件x。

这些就是常见基本的智能合约知识。  区块链本身很复杂,但是以太坊等为了大家更方便的使用区块链,编写了solity编程语言,方便大家编写。

简单说,无论什么功能目的的智能合约,都是为了在链上保存数据、修改数据等。

买卖代币,就是改变数据的代币数据。

如果有两个以上卖单都要卖掉同一账户的代币,这就是著名的“双花攻击”。

发生双花时咋办?    比如账户拥有者,丢失了秘钥匙,黑客和拥有者同时都想转走所有代币,谁会成功?

以太坊的解决,就是为这两笔交易  自动选择交易序列,并打包到区块中,然后在所有参与节点中执行和分发,先发生的交易会被确认记录在区块中,后发生的会被拒绝,不会记录在区块中。

这就做到了一笔钱,只会一个人转走成功,不会两边都转走成功。

以太坊的所有指令都是围绕uint类型的数值,就是256整数的数值,进行操作。常见的操作就是算数、位、逻辑、比较,还有有条件和无条件跳转。可以访问当前区块的相关属性,比如编号和时间戳。

日志:为了大家及时直观的了解数据变动,  就用events 事件把想要看到的数据的变动, 及时发布到日志上。日志是一个特殊的可索引的数据结构,日志的数据可以直接反应区块上的数据。日志可以区块链外高效安全访问,而不用接触到区块链,  安全又方便的实现了大家都可以查看区块链上的数据。

所以智能合约的编程都是围绕着区块链上的数值进行,  目标单纯,编程就容易多了,  更主要用智能合约把区块链的威力发挥出来。

作者:NervosFans
链接:https://www.jianshu.com/p/4cb971cf7b86
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

发表评论

电子邮件地址不会被公开。 必填项已用*标注