区块链技术(二):以太坊编程语言Solidity安装及入门初体验

2017 年 12 月 30 日 FinTech前哨 点我▷



安装

如果你想测试一段简单的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
 cd webthree-umbrella
 ./webthree-helpers/scripts/ethupdate.sh --no-push --simple-pull --project solidity # 更新Solidity库
 ./webthree-helpers/scripts/ethbuild.sh --no-git --project solidity --all --cores 4 -DEVMJIT=0 # 编译Solidity及其它
 # 在OS X系统加上DEVMJIT将不能编译,在Linux系统上则没问题

如果你选择安装Alethzero和Mix:

  git clone --recursive https://github.com/ethereum/webthree-umbrella.git
 cd webthree-umbrella && mkdir -p build && cd build
 cmake ..

好了,正常的话所有安装完毕。

入门初体验


2.1 一个简单的智能合约

先从一个非常基础的例子开始

contract ZhaoxiStorage {

   uint storedData;

   function set(uint x) {
       storedData = x;
   }

   function get() constant returns (uint retVal) {
       return storedData;
   }
}

在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);

   // 这个构造函数的代码仅仅只在合约创建的时候被运行。
   function ZhaoxiCoin() {
       minter = msg.sender;
   }

   // 合约创建者可以调用mint
   function mint(address receiver, uint amount) {
       if (msg.sender != minter) return;
       balances[receiver] += amount;
   }

   // send可以被拥有代币的任何人调用
   function send(address receiver, uint amount) {
       if (balances[msg.sender] < amount) return;
       balances[msg.sender] -= amount;
       balances[receiver] += amount;
       Sent(msg.sender, receiver, amount);
   }
}

address public minter 这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有public关键字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下:

function minter() returns (address) { return minter; }

下一行代码mapping (address => uint) public balances; 创建了一个public的状态变量,但是其类型更加的复杂。该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0。对于一个mapping,无法获取一个包含其所有key或者value的链表。所以我们得自己记着添加了哪些东西到mapping中。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:

function balances(address _account) returns (uint balance) {
   return balances[_account];
}

event Sent(address from, address to, uint value)这行代码声明了一个“事件”。由send函数的最后一行代码触发。客户端可以监听这些由区块链触发的事件。事件触发时,监听者会同时接收到from,to,value这些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:

ZhaoxiCoin.Sent().watch({}, '', function(error, result) {
   if (!error) {
       console.log("ZhaoxiCoin transfer: " + result.args.amount +
           " coins were sent from " + result.args.from +
           " to " + result.args.to + ".");
       console.log("Balances now:\n" +
           "Sender: " + ZhaoxiCoin.balances.call(result.args.from) +
           "Receiver: " + ZhaoxiCoin.balances.call(result.args.to));
   }
}

这里有个比较特殊的函数 ZhaoxiCoin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创建者的地址。msg(以及tx和block)是一个全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。msg.sender 总是存放着当前函数的外部调用者的地址。

最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。

以上就是一个简单的加密货币的完整代码和说明。

下期预告

长按二维码关注公众号



明天将发布区块链技术(三)


智能合约入门


登录查看更多
1

相关内容

Ubuntu[国际音标:[uːˈbuːntuː](英语);[ùɓúntú](祖鲁语)]是一个以桌面应用为主的GNU/Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名),意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【圣经书】《强化学习导论(2nd)》电子书与代码,548页pdf
专知会员服务
201+阅读 · 2020年5月22日
专知会员服务
31+阅读 · 2020年4月24日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
179+阅读 · 2020年1月1日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
资源|Blockchain区块链中文资源阅读列表
专知会员服务
43+阅读 · 2019年11月20日
【新书】Python编程基础,669页pdf
专知会员服务
193+阅读 · 2019年10月10日
通过Docker安装谷歌足球游戏环境
CreateAMind
11+阅读 · 2019年7月7日
手把手教你用Python做一个哄女友神器,小白可上手
网易智能菌
5+阅读 · 2019年6月15日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
手把手教你搭建caffe及手写数字识别
七月在线实验室
12+阅读 · 2017年11月22日
Python NLP入门教程
Python开发者
9+阅读 · 2017年11月19日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
A Survey on Edge Intelligence
Arxiv
50+阅读 · 2020年3月26日
Arxiv
3+阅读 · 2018年9月12日
Arxiv
7+阅读 · 2018年6月1日
Arxiv
8+阅读 · 2018年4月8日
Arxiv
6+阅读 · 2018年2月26日
VIP会员
相关VIP内容
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【圣经书】《强化学习导论(2nd)》电子书与代码,548页pdf
专知会员服务
201+阅读 · 2020年5月22日
专知会员服务
31+阅读 · 2020年4月24日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
179+阅读 · 2020年1月1日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
资源|Blockchain区块链中文资源阅读列表
专知会员服务
43+阅读 · 2019年11月20日
【新书】Python编程基础,669页pdf
专知会员服务
193+阅读 · 2019年10月10日
相关资讯
通过Docker安装谷歌足球游戏环境
CreateAMind
11+阅读 · 2019年7月7日
手把手教你用Python做一个哄女友神器,小白可上手
网易智能菌
5+阅读 · 2019年6月15日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
手把手教你搭建caffe及手写数字识别
七月在线实验室
12+阅读 · 2017年11月22日
Python NLP入门教程
Python开发者
9+阅读 · 2017年11月19日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
相关论文
Top
微信扫码咨询专知VIP会员