Solidity 是 Ethereum 的一种契约型编程语言,运行在Ethereum虚拟机(EVM)之上。
它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:
以太坊底层是基于帐户,而非UTXO的,所以有一个特殊的Address的类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个帐户)。
由于语言内嵌框架是支持支付的,所以提供了一些关键字,如payable,可以在语言层面直接支持支付。
存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定变量使用内存,还是区块链。
运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行。
最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。
Browser-solidity 是一个官方提供的一个基于浏览器的合约编译器,而且build版本会紧跟最新的 Solidity的 build 版本。
可在浏览器中直接访问,地址为
https://remix.ethereum.org
源码在 github 上https://github.com/ethereum/remix-ide
可安装到本地使用,如果在线编辑体验不佳。
https://github.com/horizon-games/remix-app/releases
npm install remix-ide -g
remix-ide
git clone https://github.com/ethereum/remix-ide.git
git clone https://github.com/ethereum/remix.git # only if you plan to link remix and remix-ide repositories and develop on it.
cd remix-ide
npm install
npm run setupremix # only if you plan to link remix and remix-ide repositories and develop on it.
npm start
简单设置
下面是一个简单的智能合约代码,功能是输入任何数值,都加上 2009。
pragma solidity 0.4.9;
contract mshkDemo {
function mshkadd(uint a) public returns (address, uint b) {
uint resutl = a+2009;
return (msg.sender, resutl);
}
}
pragma solidity ^0.4.0
var mahkdemoContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"mshkadd","outputs":[{"name":"","type":"address"},{"name":"b","type":"uint256"}],"payable":false,"type":"function","stateMutability":"nonpayable"}]);
var mahkdemo = mahkdemoContract.new(
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000c57fe5b5b60e48061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ee64a56014603a575bfe5b3415604157fe5b60556004808035906020019091905050609e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6000600060006107d9840190503381925092505b509150915600a165627a7a723058208fbdb1b57d864dd6c64a4880c43b12fc10e102ac0ce93221135eba28c8e1c3f50029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
geth javascript console
中执行。如果被成功的挖矿打包进区块,会返回。> miner.start()
null
> null [object Object]
Contract mined!
address: 0x702f69fe301c5d959b10fea629faf71d9ec71944
transactionHash: 0x27ca30f885ec0c10e41728bad4317f12811b65284f7a63217f6fd1f78f4e6cea
字段解释:
输入 mahkdemo 可以看到合约的一些信息
> mahkdemo
{
abi: [{
constant: false,
inputs: [{...}],
name: "mshkadd",
outputs: [{...}, {...}],
payable: false,
stateMutability: "nonpayable",
type: "function"
}],
address: "0x702f69fe301c5d959b10fea629faf71d9ec71944",
transactionHash: "0x27ca30f885ec0c10e41728bad4317f12811b65284f7a63217
allEvents: function(),
mshkadd: function()
}
mshkdemo.mshkadd.call
调用, 如果在挖矿的前提下:> mahkdemo.mshkadd.call(10)
["0xf94caf51cf2aa14327e7f4b500b71e19f7b20352", 2019]
> mahkdemo.mshkadd.call(20)
["0xf94caf51cf2aa14327e7f4b500b71e19f7b20352", 2029]
> mahkdemo.mshkadd.call(30)
["0xf94caf51cf2aa14327e7f4b500b71e19f7b20352", 2039]
> mahkdemo.mshkadd.call(40)
["0xf94caf51cf2aa14327e7f4b500b71e19f7b20352", 2049]