1、solidity中最好不要使用var,使用let,const进行代替。 2、msg.sender,msg.value pragma solidity ^0.4.24; contract Foo06{ address public owner; uint256 a; constructor() public{ owner=msg.sender; } } 由于构造函数只执行
1、solidity中最好不要使用var,使用let,const进行代替。
2、msg.sender,msg.value
contract Foo06{
address public owner;
uint256 a;
constructor() public{
owner=msg.sender;
}
}
由于构造函数只执行一次,因此owner里面的值只会被赋值一次,即owner里面永远都是第一次执行构造函数的时候的值,msg.sender就是owner的值。msg.sender任何人调用了合约的方法,这笔交易中的from就是msg.sender,并不一定是合约的创造者,即不一定是合约的管理者。在部署合约的时候,设置一个全局唯一的合约所有者,后面可使用权限控制。
合约可以通过payable接受钱,但是对钱进行限定,使用msg.value对合约接受到的钱进行控制,函数使用了msg.value,函数需要修饰为payable。
pragma solidity ^0.4.24;contract Foo07{
uint256 public money;
function paly() public payable{
money=msg.value;
}
}
=========================================
pragma solidity ^0.4.24;contract Foo07{
uint256 public money;
function paly() public payable{
money=msg.value;
}
function getBalance() public view returns(uint256){
return address(this).balance;
}
}
===========================================
pragma solidity ^0.4.24;contract Foo07{
uint256 public money;
function paly() public payable{
require(msg.value>100);
money=msg.value;
}
function getBalance() public view returns(uint256){
return address(this).balance;
}
}
//使用require进行错误处理
===================================
pragma solidity ^0.4.24;contract Foo07{
uint256 public money;
mapping(address=>uint256) public personToMoney;
function paly() public payable{
require(msg.value>100);
personToMoney[msg.sender]=msg.value;
money=msg.value;
}
function getBalance() public view returns(uint256){
return address(this).balance;
}
}
同时使用msg.sender和msg.value
3.全局变量
使用ganache图形化工具测试
contract Foo08{
byte public blockhash1;
address public coinbase;
uint public difficulty;
uint public gaslimit;
uint public blockNum;
uint public timestamp;
bytes public calldata1;
uint public gas;
address public sender;
bytes4 public sig;
uint public msgValue;
uint public now1;
uint public gasPrice;
address public txOrigin;
constructor() payable {
blockNum=block.number;
coinbase=block.coinbase;
difficulty=block.difficulty;
gaslimit=block.gaslimit;
timestamp=block.timestamp;
calldata1=msg.data;
gas=gasleft();
sender=msg.sender;
sig=msg.sig;
msgValue=msg.value;
now1=now;
gasPrice=tx.gasprice;
txOrigin=tx.origin;
}
}
4错误处理
require(<条件>) 进行错误处理
5修饰器
pragma solidity ^0.4.24;contract Foo08{
uint256 public money;
constructor() ff() payable{
money=msg.value;
}
modifier ff() {
require(msg.value>100);
_;
}
}
6事件
pragma solidity ^0.4.24;contract Foo08{
uint256 public money;
event playEvent(uint256);
constructor() ff() payable{
money=msg.value;
emit playEvent(money);
}
modifier ff() {
require(msg.value>100);
_;
}
}
7 货币单位
1ether=10**18wei
1ether=1000finney
1ether=1000000szabo
8访问函数
pragma solidity ^0.4.24;contract Foo009{
uint256 public data=200;
function getData() returns(uint256){
return this.data();
}
}
this.后的状态变量需要加括号()。
9合约创建
pragma solidity ^0.4.24;contract Foo009{
uint256 public data=200;
function getData() public view returns(uint256){
return this.data();
}
}
contract Foo091{
address public ct1;
function getCt(uint256 addr) public view returns (uint256) {
Foo009 f09=Foo009(addr);
return f09.getData();
}
}
创建一个合约,返回地址
地址只有balance和transfer方法。
keccak256(…) returns (bytes32):
使用以太坊的(Keccak-256)计算HASH值。紧密打包参数。