主页 > 下载imtoken钱包地址 > 区块链技术(二):以太坊编程语言Solidity安装及初步体验
区块链技术(二):以太坊编程语言Solidity安装及初步体验
安装
如果你想测试一个简单的 Solidity 合约,你不需要安装任何东西以太坊智能合约的编程语言,只需访问基于浏览器的 Solidity:
1.1通过npm/node.js命令在线安装
npm install solc
如何使用nodejs包的详细信息可以在代码库中找到:#nodejs-usage%E3%80% 82
1.2二进制安装包
包含 Mix IDE 的二进制 Solidity 安装包可以从以太坊网站的 C++ 包中下载:%E3%80%82
1.3 从源代码构建
在 MacOS X、Ubuntu 和其他类 Unix 系统上构建和安装 Solidity 非常相似。本指南首先解释如何为每个平台安装相关依赖项,然后构建 Solidity。
1.4 MacOS X
系统要求:
安装自制软件:
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
不同版本使用不同get命令的原因是libjsonrpccpp-dev已经在Ubuntu通用代码库中15.10之后。
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 的无符号整数uint 类型的状态变量。可以看成是数据库中的一条记录,可以通过调用函数进行查询和修改。在以太坊中,通常只有合约的所有者才能做到这一点。在本例中,set 和 get 函数分别用于修改和查询变量的值。
与许多其他语言一样,您无需添加此项。访问状态变量的前缀。
任何人都可以调用 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 这行代码声明了一个可公开访问的地址类型的状态变量。地址类型的值大小为 160 位,适用于存储合约地址或他人的公私钥。 public 关键字自动为其修改的状态变量生成访问函数。没有 public 关键字的变量将无法被其他合约访问。此外,只能编写该合约中的代码。自动生成的函数如下:
function minter() returns (address) { return minter; }
下一行代码映射(地址=> uint)公共余额;创建一个公共状态变量,但它的类型更复杂。此类型将某个地址映射到无符号整数。映射可以被认为是一个哈希表,其中每个可能的键对应的值实际上被初始化为全 0。对于映射,不可能获得包含其所有键或值的链表。所以我们必须记住要添加到映射中的内容。在这个例子中,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));
}
}
兆熙币有一个特殊功能。它是一个构造函数,在创建合约时运行,之后无法调用。它将永久存储合约创建者的地址。 msg(连同 tx 和 block)是一个全局变量,其中包含一些区块链特定的属性,这些属性可以被合约代码访问。 msg.sender 始终保存当前函数的外部调用者的地址。
最后,用户或其他合约实际调用来完成本合约功能的函数是mint和send。如果合约创建者以外的其他人调用 mint,则不会发生任何事情。并且任何人都可以调用 send (具有一定数量的代币)将一些硬币发送给其他人。