智能合约:solidity语法(二)


地址javascript


以太坊的每一个帐户都有一个地址,这个地址就是这个帐户的标识,相似这个样子:php

0x3C7f1E9B49B2f7c92e25224199d05D5Cb6923824java


映射typescript


映射是以太坊中另外一种存储和组织数据的方法,映射本质上是存储和查找数据所用的键值对,咱们看一个例子:数组


mapping (uint => string) userIdToName;//这个例子中咱们能够经过 id 去存储或查找用户名


msg.sender微信


msg.sender 是 solidity 中的一个全局变量,他表示的是当前调用者(或智能合约)的地址app

mapping (address => uint) favoriteNumber;//设置一个映射,键是address,值是uintfunction setMyNumber(uint _myNumber) public { // 写个函数来设置favoriteNumber favoriteNumber[msg.sender] = _myNumber; // 设置favoriteNumber映射,将_myNumber存储在msg.sender名下}function whatIsMyNumber() public view returns (uint) { // 写一个查询favoriteNumber的函数 return favoriteNumber[msg.sender]; // 若调用者还没调用setMyNumber,则值为0}

require函数


能够经过 require 来作一些限制,好比 _name 要等于 yichen 才能继续执行,不然报错:
区块链


function test(string _name) returns (string){retuire(keccak256(_name) == keccak256("yichen"));//solidity 不支持字符串直接比较,因此这里用散列值比较return "hello";}


若是调用的时候是 test("yichen"); 就会返回 hello,不然报错ui


继承(Inheritance)


当代码很长的时候咱们能够把它们拆分红不一样的合约,经过继承来得到其余合约的功能

contract welcome { function hi() public returns (string) { return "hi!"; }}contract welcome2 is welcome { function hello() public returns (string) { return "hello"; }}

引入(Import)


solidity 也支持 import(solidity 文件后缀是 sol)


import "./sayhello.sol";


Storage与Memory


solidity 中有两个能够存储变量的地方 Storage 与 Memory


Storage 变量是永久的存储在区块链中的变量

Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除

一个比较好的比喻是:Storage 理解为硬盘上存储的数据,Memory 理解为内存上的数据


状态变量(在函数以外声明的变量)默认为 Storage 形式,并永久写入区块链

在函数内部声明的变量是 Memory 型的,它们函数调用结束后消失


还有一些特殊状况,须要手动指定存储类型,好比:处理函数内部的结构体和数组


更多函数可见性


函数声明 private 以后,哪怕是继承这个合约的子合约都不能调用,因此可使用更好的方法 internal

用 internal 声明的函数,继承了这个函数所在合约的子合约能够调用这个函数,同时又限制了其余人随便调用


external 声明的函数只能在合约以外调用,不能被合约内的其余函数调用


接口


若是咱们想要与其余合约进行交互的话,须要声明一个接口

好比上面的那个最爱的数字的合约

contract LuckyNumber { mapping (address => uint) favoriteNumber; function setMyNumber(uint _myNumber) public { favoriteNumber[msg.sender] = _myNumber; } function whatIsMyNumber(address _myaddress) public view returns (uint) { return favoriteNumber[_myaddress]; }}

若是咱们想要在另外一个合约中调用它,来调用者的数字

首先要定义一个接口,能够对比看一下,接口与合约不一样之处在于咱们只声明了要交互的函数并且没有函数体

编译器就是靠着这些特征识别出这个接口的


contract NumberInterface {function whatIsMyNumber(address _myAddress) public view returns (uint);}


使用接口


只要咱们的合约是 public 或者 external,就能够与其余合约进行交互


NumberInterface numberContract = NumberInterface(LuckyNumber合约的Address);// 如今变量 numberContract 指向另外一个合约对象uint num = numberContract.getNum(msg.sender);//把咱们的 favoriteNumber 赋值给 num


if语句


 if (keccak256(_name) == keccak256("yichen")) { hello();}

本文分享自微信公众号 - 陈冠男的游戏人生(CGN-115)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索