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;
}
}
由于構造函數隻執行一次,是以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圖形化工具測試
pragma solidity ^0.4.24;
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();
}
}