安装
如果你想测试一段简单的Solidity合约,你不需要安装任何东西,只要访问基于浏览器的Solidity就可以:
https://chriseth.github.io/browser-solidity/
1.1 通过NPM / node.js命令在线安装
npm install solc
如何使用nodejs包的详细信息可以在代码库中找到:https://github.com/chriseth/browser-solidity#nodejs-usage%E3%80%82
1.2 二进制安装包
包括Mix IDE的二进制Solidity安装包在Ethereum网站C++ bundle中下载:https://github.com/ethereum/webthree-umbrella/releases%E3%80%82
1.3 从源码构建
在MacOS X、Ubuntu和其它类Unix系统中编译安装Solidity非常相似。这个指南开始讲解如何在每个平台下安装相关的依赖软件,然后构建Solidity。
1.4 MacOS X
系统需求:
Homebrew
Xcode
安装Homebrew:
brew update
brew install boost --c++11# 需要等待一段时间
brew install cmake cryptopp miniupnpc leveldb gmp libmicrohttpd libjson-rpc-cpp# 仅仅安装Mix IDE和Alethzero
brew install xz d-bus
brew install llvm --HEAD --with-clang
brew install qt5 --with-d-bus# 避免长时间的等待没有提示,可以添加 —verbose 输出信息。
安装:xcode
xcode-select —install
1.5 Ubuntu系统
Ubuntu系统下面是在最新版Ubuntu系统上编译安装Solidity的指南。最佳的支持平台是2014年11月发布的64位Ubuntu 14.04安装依赖软件:在你从源码编译之前,你需要准备一些工具和依赖软件。 首先,升级你的代码库。Ubuntu主代码库不提供所有的包,你需要从Ethereum PPA和LLVM获取。 注意Ubuntu 14.04的用户需要使用:
sudo apt-add-repository ppa:george-edison55/cmake-3.x
获取最新版本的cmake。现在加入其它的包:
sudo apt-get -y update
sudo apt-get -y install language-pack-en-base
sudo dpkg-reconfigure locales
sudo apt-get -y install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get -y update
sudo apt-get -y upgrade
对于Ubbuntu 15.04(Vivid Vervet)或者更老版本,使用下面的命令获取开发相关的包:
sudo apt-get -y install build-essential git cmake libboost-all-dev libgmp-dev libleveldb-dev libminiupnpc-dev libreadline-dev libncurses5-dev libcurl4-openssl-dev libcryptopp-dev libjson-rpc-cpp-dev libmicrohttpd-dev libjsoncpp-dev libedit-dev libz-dev
对于Ubbuntu 15.10(Wily Werewolf)或者更新版本,使用下面的命令获取开发相关的包:
sudo apt-get -y install build-essential git cmake libboost-all-dev libgmp-dev libleveldb-dev libminiupnpc-dev libreadline-dev libncurses5-dev libcurl4-openssl-dev libcryptopp-dev libjsonrpccpp-dev libmicrohttpd-dev libjsoncpp-dev libedit-dev libz-dev
不同版本使用不同获取命令的原因是,libjsonrpccpp-dev已经在15.10以后的Ubuntu的通用代码仓库中。1.6 编译
如果你只准备安装solidity,忽略末尾Alethzero和Mix的错误。
git clone --recursive https://github.com/ethereum/webthree-umbrella.git
cdwebthree-umbrella
./webthree-helpers/scripts/ethupdate.sh --no-push --simple-pull --project solidity# 更新Solidity库
./webthree-helpers/scripts/ethbuild.sh --no-git --project solidity --all --cores4-DEVMJIT=# 编译Solidity及其它
# 在OS X系统加上DEVMJIT将不能编译,在Linux系统上则没问题
如果你选择安装Alethzero和Mix:
git clone --recursive https://github.com/ethereum/webthree-umbrella.git
cdwebthree-umbrella&&mkdir -p build&&cdbuild
cmake ..
好了,正常的话所有安装完毕。
入门初体验
2.1 一个简单的智能合约
先从一个非常基础的例子开始
contract ZhaoxiStorage{
uint storedData;
functionset(uint x){
storedData=x;
}
functionget()constant returns(uint retVal){
returnstoredData;
}
}
在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个地址。uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为无符号整数uint。可以看做数据库里面的一条记录,可以通过调用函数查询和修改它。在以太坊中,通常只有合约的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如何增加存取限制。2.2 一个加密货币列子
接下来的合约将实现一个形式最简单的加密货币。通过这份代码,任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。
contract ZhaoxiCoin{
// 关键字“public”使变量能从合约外部访问。
address public minter;
mapping(address=> uint)public balances;
// 事件让轻客户端能高效的对变化做出反应。
event Sent(address from, address to, uint amount);
// 这个构造函数的代码仅仅只在合约创建的时候被运行。
functionZhaoxiCoin(){
minter=msg.sender;
}
// 合约创建者可以调用mint
functionmint(address receiver, uint amount){
if(msg.sender !=minter)return;
balances[receiver]+=amount;
}
// send可以被拥有代币的任何人调用
functionsend(address receiver, uint amount){
if(balances[msg.sender]
balances[msg.sender]-=amount;
balances[receiver]+=amount;
Sent(msg.sender, receiver, amount);
}
}
address public minter 这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有public关键字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下:
functionminter()returns(address){returnminter;}
下一行代码mapping (address => uint) public balances; 创建了一个public的状态变量,但是其类型更加的复杂。该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0。对于一个mapping,无法获取一个包含其所有key或者value的链表。所以我们得自己记着添加了哪些东西到mapping中。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:
functionbalances(address _account)returns(uint balance){
returnbalances[_account];
}
event Sent(address from, address to, uint value)这行代码声明了一个“事件”。由send函数的最后一行代码触发。客户端可以监听这些由区块链触发的事件。事件触发时,监听者会同时接收到from,to,value这些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:这里有个比较特殊的函数 ZhaoxiCoin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创建者的地址。msg(以及tx和block)是一个全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。msg.sender 总是存放着当前函数的外部调用者的地址。最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。以上就是一个简单的加密货币的完整代码和说明。
下期预告
本文来自企鹅号 - FinTech前哨媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - FinTech前哨媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。