240-以太坊solidity入门





以太坊solidity入门




启动以太坊钱包之后
在后台会启动一个服务
ps -ef | grep -i geth
就可以看到geth服务




MetaMask插件
会在远程启动geth服务与以太坊进行交互
我们通过MetaMask插件和MetaMask服务器进行交互
然后间接与以太坊交互



助记词
12个单词,这就是私钥
一定要保存好



web3.js
以太坊项目开发的js库







solidity

值类型
1. booleans
2. integer
3. address
4. var abc [10]byte,bytes10
5. 有理数和整型
6. 枚举 enums
7. 函数 function types

引用类型
1. 字符串
2. 不定长字节数组
3. 数组
4. 结构体





析构函数
function destroy() {

//销毁当前合约
//并把它的所有资金发送到指定地址
selfdestruct(msg.sender);

}






写点测试代码
function add(uint a, uint b) returns(uint){
	return a+b;
}


这样的话我们看不到结果
可以修改一下
function add(uint a, uint b) public view returns(uint){
	return a+b;
}





修饰词
1. public 
2. private
3. external
4. internal
5. view/constant
6. pure
7. payable
8. returns


view/constant/pure
这三个关键字都是对于状态变量而言的

view/constant表示这个函数里面不会修改状态变量
即使修改了,也不会生效
pure表示这个函数没有使用状态变量








再来点代码

contract Test{

uint public res = 0;

function add(uint a,uint b) private view returns(uint){
	return a+b;
}

}







payable修饰词
contract Test{

function invest() payable public{

}

function getBalance() public view returns(uint){
	return this.balance;
}

}









构造函数constructor
contract Test{

string public name;

constructor(string _name) payable public{
	name=_name;
}

function invest() payable public{

}

function getBalance() public view returns(uint){
	return this.balance;
}

}







address地址操作
1.balance
2.send
3.transfer


contract Test{

address account01 = 0xabcabcabc....;

function getAccountBalance() public returns(uint){
	return account01.balance;
}

function transfer01() public{
	account01.transfer(1*10**18);
}

function send() public returns(bool){
	//不会报错
	bool res = account01.send(100*10**18);
	return res;
}

function() payable{

}

function getContractBalance() public view returns(uint){
	return address(this).balance;
}

}







不定长字节数组 bytes
contract Test{

bytes public name ="abc";

function getValue(uint _i) public returns(byte){
	return name[_i];
}

function setValue(bytes _input) public{
	name = _input;
}

function setValueByIndex() public {
	name[2] = "X";
}

function getLength() public view returns(uint){
	return name.length;
}

function pushData(byte _info) public {
	name.push(_info);
}

}







字符串string
contract Test{

string public name = "lily";

function changeName1(string memory _name) pure private{
	bytes(_name)[0]="L";
}

function call1() public view{
	changeName1(name);
}

function changeName2(string storage _name) private{
	bytes(_name)[0]="L";
}

function call2() public{
	changeName2(name);
}

}




memory和storage
memory
如果不修饰,默认就是memory

如果想使用引用功能,
就需要使用storage







function localTest(string _info){
	string storage str = _info;
}

这样写的话会报错
因为function默认为memory

所以修改一下
function localTest(string _info){
	string memory str = _info;
}


或者这样
function localTest() public{
	string storage str = name;
	bytes(str)[3]="Y";
}

如果是引用类型的局部变量
默认是storage
此时对局部变量的修改
会影响到赋值的变量






这样写的话
memory和storage都可以

function localTest() public{
	string storage str = name;
	bytes(str)[3]="Y";
}

function localTest() public{
	string memory str = name;
	bytes(str)[3]="Y";
}






memory 内存
存放在内存中
超过作用域后无法访问

storage 存储
数据永久保存

状态变量总是storage的







完整代码

contract Test{

//1.引用类型的变量,既可以进行值拷贝,也可以当做引用类型不拷贝
//2.如果想使用引用功能,需要使用storage修饰

string public name = "lily";

//如果不修饰,默认是memory
function changeName1(string memory _name) private{
	bytes(_name)[0]="L";
}

function call1() public{
	changeName1(name);
}

function changeName2(string storage _name) private{
	bytes(_name)[0]="L";
}

function call2() public{
	changeName2(name);
}

//如果是引用类型的局部变量,默认是storage
//此时对局部变量的修改,会影响到赋值的变量

function localTest() public{
	string storage str = name;
	bytes(str)[3] = "Y";
}

function localTest() public{
	string memory str = name;
	bytes(str)[3] = "Y";
}

}






 

你可能感兴趣的:(ethereum)