1.solidity文件的扩展名为.sol
2.pragma solidity^0.4.0;
表示源程序在大于等于0.4.0版本的编译器中可以正常工作,在大于等于0.5.0版本的编译器中无法工作。
3.数据类型:
solidity是静态语言,所有变量在定义的时候需要定义好数据类型
(1)整数:常用的无符号整数类型有uint8,uint16,uint24......uint256(uint默认的是uint256)
有符号的整数写为int8~int256
例子:uint a=365;
(2)地址
address用来存储以太坊的地址 例子:address a=0xaadqwesczfqweqdasd
后面的0x开头的一串16进制数并不是字符串,因此不需要双引号,地址有合约地址和普通的钱包地址两种。
十六进制常量并通过地址的checksum的验证。比如 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF 是一个address类型。十六进制常量是39位到41位数字长度。如果没有通过checksum的检查,会产生一个警告,但是还是会作为一个合理的数字常量。
获取某个地址的余额:使用balance属性
例如:
contract addressTest{
function getBalance(address addr) returns (uint){
return addr.balance;
}
}
addr.balance意为获取地址addr的余额,函数getbalance的参数为一个地址,输入地址之后即可返回此地址的余额。
this:意为合约本身,比如需要获取当前合约的余额,可以这样写:
contract addressTest{
function getBalance() returns (uint){
return this.balance;
}
}
this.balance:获取当前合约的余额
地址的方法:send():用来向某个地址发送货币(单位为wei)
例子:向地址addr发送100wei
addr=0xqkwjhnckajhsdasdqwe
addr.send(100);
例子2:向一个合约充值(有待进一步理解)
pragma solidity ^0.4.0;
//请注意这个仅是Demo,请不要用到正式环境
contract PayTest {
//得到当前合约的余额
function getBalance() returns (uint) {
return this.balance;//0
}
//向当前合约存款
function deposit() payable returns(address addr, uint amount, bool success){
//msg.sender 全局变量,调用合约的发起方
//msg.value 全局变量,调用合约的发起方转发的货币量,以wei为单位。
//send() 执行的结果
return (msg.sender, msg.value, this.send(msg.value));
}
}
使用send()方法需要注意:
1.调用递归深度不能超过1024
2.gas不足会导致执行失败
3.使用这个方法需要检查成功与否
****transfer()方法也是发送以太币
例子:
address x = 0x123;
address myAddress =
this
;
if
(x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
解释:如果地址x的余额小于10并且myaddress的余额大于等于10,那么从myaddress向x发送10个以太币
send和transfer的区别:
send方法和transfer很相似,但是比transfer更低级。如果send失败,当前的合约不会中断,也不会抛出异常,会返回一个false。使用send有一些风险:如果调用栈深度超过1024或是gas不够,所有的转让操作都会失败,为了更安全的以太币转移,如果用send就必须每次都要检查返回值,使用transfer方法会更好
(3)布尔型
和其他语言一样,取值为true和false
支持的运算符:
!逻辑非
&& 逻辑与
|| 逻辑或
== 等于
!= 不等于
备注:运算符&&
和||
是短路运算符,如f(x)||g(y)
,当f(x)
为真时,则不会继续执行g(y)
。