智能合约开发浏览器(初学者推荐使用):
Remix - Ethereum IDE
int和uint的区别:
int表示的是数据整数,而uint对应于无符号整数。
internal 可以在内部被调用,不能够在外部被调用,可以被继承
external不能够在内部被调用,只能够在外部调用,可以被继承,如果强行调用,通过 "地址."
public权限最大,可以在外部内部调用,可以被继承
pure不会读取全局变量,更不会修改全局变量。一个固定的输入就会有一个固定的输出,不消耗gas
constant在函数中,和view相同,在全局变量中,只用于bytes1--byte32,uint,int,string、代表数据不能够被修改
view值读取全局变量的值,不修改它。不消耗gas
payable转账的时候必须要加在参数(取决于版本)或者方法上的关键字。
bytes介绍:
一个特殊的动态数组,该数组里面存放的数据为uint类型,或者存放 **进制的字符。
bytes可以在公共变量使用new 创建,并且在里面设置固定的长度,如果在方法里面就不可以直接使用new创建对象了。需要使用到关键字 memory
function getBytes12() view returns(bytes){
bytes memory by = new bytes(name.length);
for(uint i = 0;i< name.length; i++){
by[i] = name[i];
}
return by;
}
bytes.push() 将数据插入到数组后面,类似于拼接。
bytes不可以直接使用 bytes(string) 这种方式转换类型的
view :标记该方法不需要请求外部资源,在方法上面加上,执行时可以不需要消耗燃料。
function getA1() view public returns(bytes1){
return a1-a2;
}
for : 一个循环,里面如果使用int类型的话需要使用uint,不然会出异常的。 下面代码是遍历一个数组,将第一个数据的数据赋值给第二个数组。
for(uint i = 0;i< name.length; i++){
by[i] = name[i];
}
string : 这个string和java里面string都是一样的,但是他们的方法是不一样的。
首先这个string的话是没有length长度方法的,如果想要获取长度的话需要转换成bytes在取长度。
获取string长度
bytes(string).length
//下面是将bytes转换成string,前提条件是bytes必须是动态的数组才行,就像我上面for循环添加bytes到动态bytes里面
string(adm)
address:关键字地址,在智能合约里面每个账户都有两个地址,一个地址是外部地址,还有一个是合约地址。地址其实就是一串数字,他是由一个uint160的数字组成的。
payable:表示可以通过这个函数给我们的合约地址转账。
function pay() payable{
}
获取智能合约账户余额:
function getBals() public view returns(uint){
//表示获取智能合约余额 其中this代表的是我们的合约地址 .balance是获取余额
return this.balance;
}
获取账户余额:
function getAmount() public view returns(uint){
address dir = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
return dir.balance;
}
向指定地址转账:
msg.value代表的是一个全局变量,由外部的value值进行覆盖,我们也可以直接写 10 ether ,后面的单位根据实际情况来。
function zhuanzhang() payable{
//表示当前外部地址向下面地址转账
address dir = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;
dir.transfer(msg.value);
}
//向合约地址转账
function zhuanzhang() payable{
//表示当前外部地址向下面地址转账
this.transfer(msg.value);
}
//需要加一个回滚函数才能使用上面的方法进行合约地址转账
function() payable{
}
全局变量:
function getin() public view returns(address){
//返回合约调用者的地址
return msg.sender;
}
function getdifficulty() public view returns(uint){
//返回当前块挖矿的困难度
return block.difficulty;
}
function number() public view returns(uint){
//返回当前区块高度
return block.number;
}
function gaslimit() public view returns(uint){
//交易gas价格
return tx.gasprice;
}
function coinbase() public view returns(address){
//当前块是那个矿工挖出来的
return block.coinbase;
}
mapping数据绑定
mapping类似java里面的map键值对。
//mapping类似java里面的map键值对
mapping(address => uint) ads;
mapping(string => uint) adc;
function set(string name){
//赋值方法
ads[msg.sender] = 1;
adc[name]=2;
}
function get(string number) public view returns(uint){
//赋值方法
return adc[number];
}
mapping(uint => mapping(uint => mapping(uint => string))) public map;
function getMap(){
//我们可以通过外部传参 0,1,3 来获取到我们定义的字符串
map[0][1][3]="nihao";
}
internal:
被internal修饰的方法可以被继承,也可以在合约内部被调用,但是不能外部调用,就是不能在外部通过点触发函数执行。
is 继承关键字。
private 私有的,不能被继承。
pure和view:只要有了pure与view修饰符的函数,那么调用函数就不会消耗gas。
pure不会读取全局变量,更不会修改全局变量。一个固定的输入就会有一个固定的输出
storage : 地址引用,该表引用值会改变原有值。
user er;
function setUser(user storage u) internal{
user map = u;
map.name="nihao你好232";
}
function getUser() returns(string){
setUser(er);
return er.name;
}
memory : 可以复制地址值,复制的可以被修改、
external关键字
使用该该关键字标注的不能使用内部函数调用,需要使用this关键字调用。
contract hgozaohanshu {
function test() external pure returns(string){
return "nihao";
}
}
contract hgozaohanshu1 is hgozaohanshu{
function test2() public view returns(string){
//this 他是代表一个合约地址,通过地址点方法去调用,这样也相当于外部调用,
return this.test();
}
}
enum :
//这个里面的属性我们可以自己定义,他们初始值分别是1,2,3.......,里面不可以包含中文
enum girl{zhangshang,lishi,wangwu}
girl zhangs = girl.zhangshang;
function getGisl() public returns(girl){
zhangs = girl.lishi;
return zhangs;
}
function ifnulkl() public view returns(string){
require(zhangs == girl.lishi,"异常");
return "panduan判断cgo判断成功l";
}
重载:
智能合约里面也会有重载,但是需要注意几个事项。
1、如果我们写一个重载函数,分别传入uint和uint8的话,直接在下面调用,调用参数如果都可以匹配两个函数的话就会抛出异常。
uint public b = 0 ;
function id(uint a){
b=100;
}
function id(uint8 a){
b=200;
}
function getId(){
//这里调用时如果下面输入1-255都会报错,因为他可以匹配两个构造函数
id(256);
}
function id2(uint160 number){
b=100;
}
function id2(address number){
b=200;
}
function getId2(){
//地址其实就是uint160这样的一串数字,老版本的话这里传入地址上面的
构造函数将不能识别,新版本的话可以调用,他会调用为address 这个方法。
id2(0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db);
}
如果这篇文章在你一筹莫展的时候帮助到了你,可以请作者吃个棒棒糖,如果有啥疑问或者需要完善的地方欢迎大家在下面留言或者私信作者优化改进。