当前位置 : 主页 > 编程语言 > java >

solidity阶段性总结

来源:互联网 收集:自由互联 发布时间:2022-06-23
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

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);
_;
}
}

solidity阶段性总结_权限控制

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值。紧密打包参数。


上一篇:solidity使用异常处理
下一篇:没有了
网友评论