上周题目难度是'Hard',就没写,这周小伙伴鸽了,可能下周会做两道吧。以下内容是笔记,写的比较乱,就不整理了:)
function
function name(<parametertypes>) {public|private|internal|external}[constant][payable][returns(<return types>)]{content}
public:即可以被其他合约调用,也可以在本合约挂接调用
external:可以被其他合约调用,本合约调用this.f()
internal:只能在本合约或子类合约中调用
private:只能在本合约调用
匿名函数
一个合约可以有一个匿名函数,此函数不能有参数和返回值,当执行合约上没有的函数或是对这个合约发送ETH的时候,就会执行此匿名函数。
综合小demo:
pragma solidity ^0.4.18;
contract People {
struct people{
address add;
string name;
uint age;
}
people public p;
event e(address _add, string _name,uint _age);
function creatP(address _add,string _name, uint _age) external{
emit e(_add, _name, _age);
p = people(_add, _name, _age);
emit e(p.add, p.name, p.age);
}
}
contract Config {
uint public version = 1;
enum Weeks{M1,T2,W3,T4,F5,S6,S7}
function v() external returns(Weeks){
version += 1;
return Weeks.M1;
}
}
contract Test {
address public owner;
event e(string _str,uint num);
uint public num = 100;
uint public value;
uint public price;
uint public limit;
uint public gas;
bool public success;
constructor() payable public{
owner = msg.sender;
}
function testContract() payable public{
emit e("before",num);
delete num;
emit e("after",num);
}
modifier onlyOwner{
require (msg.sender == owner);
_;
}
function otherContract() public onlyOwner{
People a = new People();
a.creatP(msg.sender,"Steven",18);
Config b = new Config();
b.v();
}
function transfer(address _add, uint amount)payable public {
value = msg.value;
gas = gasleft();
price = tx.gasprice;
limit = block.gaslimit;
success = _add.send(amount);
}
function() payable public{
num += 1;
}
}
继承
demo为多重继承,C继承A和B
contract A{}
contract B{
constructor (uint _u){}
}
contract C is A,B(20){}
自毁
销毁当前合约,并将当前合约的余额发到指定的地址
contract A{
function kill(address add){
selfdestruct(add);
}
}
call
B call A,B不发生变化,A发生变化
delegatecall
B delegatecall A, B发生变化,A不发生变化
pragma solidity ^0.4.18;
contract A{
uint public result;
function numPlus(uint a, uint b) public returns(uint){
result = a + b;
return result;
}
}
contract B{
uint public result;
bool public success;
function call1(address _add) public{
success = _add.call(bytes4(keccak256("numPlus(uint256,uint256)")),3,3);
}
function call2(address _add) public{
success = _add.delegatecall(bytes4(keccak256("numPlus(uint256,uint256)")),333,333);
}
}
就酱,下一篇就是发行token了~
网友评论