Solidity 是以太坊(Ethereum)指定用於智能合約開發的程式語言。
其語法類似於 JavaScript,擁有強型別、var 型別推論等特性。
列出幾種常件的開發工具,比較推薦的是 browser-solidity,可以解決不同以太坊版本與 Solidity 之間差異問題。
npm install solc -g
solcjs --help
solcjs contract.sol
Solidity 基本由三個架構組成:
contract HelloWorld
{
string public greeting = "";
function setHelloWorld()
{
greeting = "hello, world";
}
}
Solidity 為了結合智能合約帳戶及數位貨幣概念,設計了一些特殊型別,以便於進行如帳戶餘額的資料存取。
uint constant HEX_NUM = 0x123A1;
bytes32[5] nicknames; //靜態陣列
bytes32[] names; //動態陣列
names.length; //陣列長度
T[] t; //動態長度陣列
T[N] t; //N 長度陣列
T[N][M] t; //M x N 陣列
//K, V 為泛型,其中 K 不可以為 Mapping 型別
//當 K 不存在時,V 為 0
//Ktype 為使用 SHA3 產生的哈希值
mapping (Ktype => Vtype) myMap;
地址(address):以哈希值作為為ㄧ的合約或帳戶代碼
address public owner;
mapping (string => uint) public balances;
balances["Bob"] = 10 ether;
Structs 範例:
struct Bank
{
address owner;
uint balance;
}
Bank bank = Bank
(
{
owner: "0x692a70d2e424a56d2c6c27aa97d1a86395877b3a"
,balance: 5
}
);
自訂型別範例:使用 enums
enum Direction { Left, Right, Up, Down };
Direction myDirection = Direction.Up;
block.blockhash(uint blockNumber) returns (bytes32)
block.coinbase; // 挖礦者的地址
block.gaslimit; // 現在區塊的 gas 限制
block.number; // 現在區塊的編號
block.timestamp; // 現在區塊的時間,不等於確認(commit)時間
msg.sender; // 訊息的發送者
msg.value; // 隨著訊息攜帶了多少貨幣 - wei
tx.origin; // 交易的發送者
block.timestamp; //等同於 block.timestamp
#### 流程控制
return;
return VALUE,..;
function NAME(ARG,..) VISIBILITY returns (TYPE,...) {}
Solidity 線上文件:https://solidity.readthedocs.io