Solidity是专门为实现智能合约创建的高级编程语言。 借鉴了c++、python和javascript编程语言,目标是最好的适应在以太坊虚拟机evm上运行。
尝试solidity编程最好使用Remix,集成了需要的编译器和运行环境,方便编写、部署和运行智能合约。
编写智能合约后, 最好进行代码审查、检测、审计和正确性证明等措施提高可靠性。
Solidity工具介绍:
Dapp:编程的构建工具、包管理器和部署助手。
Solidity REPL:命令行控制台,可以直接尝试Solidity编程。
Solgraph:可视化编程控制流,还能标示出潜在安全漏洞。
Evmdis:EVM反汇编程序,可以静态分析字节码,能提供比EVM操作更高级的抽象。
Doxity:生成文档。
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData;
function set(uint x)public {
storedData= x;
}
function get() publicconstant returns (uint) {
returnstoredData;
}
}
存储Solidity中合约就是函数和数据(状态),都在以太坊区块链的一个特定地址上。
pragma solidity ^0.4.0; 说明这段代码是用solidity的4.0版本编写。Pragma是用来告知编译器如何处理这段代码。
contract SimpleStorage 是说写的这段代码是一个简单存储SimpleStorage的合约。
uint storedData;是说有个256位无符号整数(uint)的storedData; 就是存储的数据storedData 限定为256位只有整数。
function set(uint x) public {
这个是说所有人可以公开用(public)函数set来改变 256位无符号整数x的值,
storedData = x;
}
这里是说 storedData = x; 也就是x和storedData是一样的。
说一整个 所有人调用set设置改变的就是 storedData的内容,是一个256位的整数。
function get() public constant returns(uint){
这行是说所有人可以公开(public)用函数get得到一个256位的整数(uint)
return storedData;
}
这是整数哪里来的? 就是返回(return)了数据storedData。
所以所有人都可以用函数get得到的就是存储的数据storedData。
综合起来这个合约是什么功能? 这个合约能允许任何人在合约里存储一个256位的数字,并且这个数字可以被世界上任何人访问看到。任何人更改数字后,会覆盖掉之前的数字,但之前的数字会一直保存在以太坊区块链的历史记录中。
子货币(subcurrency)发行一个简单的货币。
pragma solidity ^0.4.21;
contract Coin {
address public minter;
mapping (address =>uint) public balances;
event Send(address from,address to, uint amount);
function Coin() public {
minter= msg.sender;
}
function mint(addressreceiver, uint amount) public {
if(msg.sender != minter) return;
balances[receiver]+= amount;
}
function send(addressreceiver, uint amount) public {
if(balances[msg.sender] < amount) return;
balances[msg.sender]-= amount;
balances[receiver]+= amount;
emitSent(msg.sender, receiver, amount);
}
}
pragma solidity ^0.4.21; 同上一个程序, pragma说明编译器如何编译,solidity ^0.4.21说明这段代码是solidity 版本 0.4.21编写的。
contract Coin 这个合约是coin。
address public minter; address是表示一个160位的数值,不允许任何算数操作。Address这个类型适合存储合约地址或外部人员的秘钥地址。Public同上一段程序,表示所有人都能公开访问这个函数,就是访问这个状态变量当前数值。
Minter是一个任何人可以公开访问的160位不可改变的数值。
mapping (address => uint) public
balances;所有人都可以查询账户的余额。
event Send(address from, address to,
uintamount);event说明这行代码是个“事件”,会在send函数最后结束被发出,用户界面,包括服务器应用程序可以监听正在发送的事件,成本很小。一旦事件发出,监听该事件的listener会收到通知。发送的数据都有什么呢? 就是address类型160位数值的数据from和to,uint类型256位整数的amount。
这段代码就是方便监听事件, 随时了解币从哪来from,去哪to,有多少量amout。
function Coin() public { ; 特殊函数coin是在创建合约期间运行的构造函数,不能在事后调用。
minter = msg.sender;msg是个一神奇的全局变量,包含一些允许访问区块链的属性。msg.sender始终是当前外部函数调用的来源地址。
function mint(address receiver, uintamount)
public {; 这里函数mint只能被用户或其他合约调用,发挥作用,如果不是合约创建者调用,就什么也没有,无法调用。
function send(address receiver, uintamount)
public {; 这里函数send可以被任何人用来向任何人发属于他自己拥有的币。
当使用合约发币给一个地址时,在区块链浏览器上查看发送目标看不到任何信息。因为发送币和更改余额的信息只存储在特定合约的数据存储器中。想看就通过使用“事件”,可以非常方便为新造的币创建一个“区块链浏览器”来追踪交易和余额。
再说一个详细的合约,电子投票。
电子投票的主要问题是如何将投票权分配给目标人群和如何防止作弊。这个合约展示如何进行委托投票,自动和完全透明的计票。
这里会为每个投票表决创建一份合约,为每个选项提供简称,给每个独立的地址分配投票权。
每个独立地址的使用者,可以自己投票,也可以委托其他人来投票。
在投票时间截止时,投票最多的会自动统计出来。
未完待续。
网友评论