关于搭建的第一个solidity ----Hello World
pragma solidity ^0.5.0; // 当前使用的solidity 的版本号
contract Hello {
string public name; // 定义一个变量 name
function sayhello() public returns (string memory){ //定义一个方法
name = 'hello world';
return name;
}
}
在remix编译器上运行这个代码
通过点击deploy来部署智能合约,部署成功后会出现下面绿色框的内容,里面展示的是你的智能合约中 public
出来的函数和变量名字;可以通过点击他们进行数据的展示和函数方法的调用。当点击sayhello的时候,会调用合约中的函数,控制台也会打印出调用成功的日志,然后再点击name查看调用之后的name的值,会发现变成了hello world
pragma solidity ^0.5.0;
contract Calculate {
uint public a = 20;
uint public b = 30;
uint public c;
function add() public{
c = a + b;
}
function sub() public {
c = b - a;
}
function mul() public {
c = a * b;
}
function div() public {
c = b / a;
}
}
上面的例子中a 和 b 已经定义并且给了固定的值,如果想要通过从外界传值的话需要改变一下代码的结构;
pragma solidity ^0.5.0;
contract Calculate {
// uint public a = 20;
// uint public b = 30;
uint public c;
function add(uint a, uint b) public{
c = a + b;
}
function sub(uint a, uint b) public {
c = a - b;
}
function mul(uint a, uint b) public {
c = a * b;
}
function div(uint a, uint b) public {
c = a / b;
}
}
点击部署之后可以传入你的参数,用逗号隔开,写入参数之后点击调用函数方法,就可以运行方法;
看起来这一切和以往的编程语言差不多~确实差不多,现在在来看看判断语句;if
的应用:
pragma solidity ^0.5.0;
contract Judge {
uint public c = 0;
function judgement(uint a, uint b) public returns(uint){
if(a > b){
return a + b;
} else if( a == b) {
return a * b;
} else {
return c;
}
}
}
pragma solidity ^0.5.0;
contract Judge {
uint[5] a = [1,2,3,4,5];
uint[] b;
function getList() public returns(uint){
for(uint i = 0; i < a.length; i++){
b.push( a[i]);
}
return b[2]; // 3
}
}
说道循环不得不说一下solidity的数组这个概念,目前对于solidity定义一个数组是有两种方式,一个是规定了数组的长度的,一个是不确定数组长度的;
uint[5] 表示定义的数组的长度是5位
;
uint[]
表示的是不确定数组的长度的情况下,一般这种数组是memory类型,
memory表示你的数据变量是临时的,这是一个标记,与他相对的是storage,就是我们常说的内存,他不是永久存在的,比如函数的参数和函数的返回值都默认的存在内存中,memory是一个临时的空间,在函数调用的时候出现,在函数调用之后被释放;
storage修饰的变量是永久存在的,比如一些复杂变量,状态变量就是存在区块链中,storage对gas的消耗是远远大于memory的;
public:
公开函数是合约接口的一部分,可以通过内部或者消息来进行调用。对于public类型的状态变量,会自动创建一个访问器。 函数默认的可见性是public
private:
私有函数和状态变量仅在当前合约中可以访问,在继承的合约内,不可访问,外部也是无法访问的。
internal:
这种状态变量可供外部和子合约调用,这种类型的函数和private类型的函数一样,智能合约自己内部调用,不过和private不一样的是,他可以在继承的合约里面调用,它和其他语言中的protected不完全一样。
external:
外部函数是合约接口的一部分,只能使用消息调用。
pragma solidity ^0.4.20;
contract Test {
uint public data;
function f(uint a) private returns (uint b) {
return a + 1;
}
function setData(uint a) internal {
data = a;
}
function exSetData(uint a) external {
data = a;
}
function testsetData(uint a) public {
setData(1);
this.exSetData(1);
}
}
contract D {
function readData() {
Test test = new Test();
// test.setData(1); 这样写会报错
test.exSetData(1);
test.testsetData(1);
}
}