Solidity的合約類似于面向對象語言中的類。它們包含存放持久化資料的狀态變量和可修改這些變量的函數。調用不同的合約執行個體上的函數将執行EVM函數調用,進而切換上下文,使得狀态變量不可通路。
建立合約(Creating Contracts)
合約可以從“外部”建立,也可以由Solidity合約創立。
像Remix這類IDE,可以用UI界面使建立過程無縫連接配接。
最好在Ethereum上以程式設計方式通過Web3.js建立合約。到今天為止,它有一種叫做web3.eth.Contract的方法來幫助合約的建立。
當建立一個合約時,它的構造函數被執行一次。構造函數是可選的。隻允許一個構造函數,這意味着不支援重載。
在内部,構造函數的參數要放在在合約代碼編譯成的ABI之後,但是如果使用
Web3.js
,則不必關心這一點。
如果是一個合約要創立另外一個合約,被創立的合約的源碼(和二進制代碼)要能被創立者知曉。這意味着循環建立依賴就成為不可能的事情。
pragma solidity ^;
contract OwnedToken {
// TokenCreator是在下面定義的合約類型
// 若它本身不用于建立新的合約的話,它就是一個引用
TokenCreator creator;
address owner;
bytes32 name;
// 這個是記載建立者者和指派名稱的構造函數
function OwnedToken(bytes32 _name) {
owner = msg.sender;
// 我們做一次由`address`到`TokenCreator` 的顯式轉換,
// 確定調用合約的類型是 TokenCreator,(因為沒有辦法來檢測這一點)
creator = TokenCreator(msg.sender);
name = _name;
}
function changeName(bytes32 newName) {
// 僅僅是創立者可以改變名稱--
// 因為合約是隐式轉換成位址上,是以這種比較是可能的
if (msg.sender == creator) name = newName;
}
function transfer(address newOwner) {
// 隻有目前合約所有者可以轉移 token
if (msg.sender != owner) return;
// 我們還要詢問合約建立者"轉移是否成功"
// 注意這會調用合約定義在下面的函數
// 如果函數調用失敗,(如gas用完了等原因)
// 程式的執行将立刻停止
if (creator.isTokenTransferOK(owner, newOwner))
owner = newOwner;
}}
contract TokenCreator {
function createToken(bytes32 name)
returns (OwnedToken tokenAddress)
{
// 創立一個新的Token合約,并且傳回它的位址
// 從 JavaScript觀點看,傳回的位址類型是"address"
// 這個是和ABI最接近的類型
return new OwnedToken(name);
}
function changeName(OwnedToken tokenAddress, bytes32 name) {
// "tokenAddress" 的外部類型也是"address".
tokenAddress.changeName(name);
}
function isTokenTransferOK(
address currentOwner,
address newOwner
) returns (bool ok) {
// 檢查各種條件
address tokenAddress = msg.sender;
return (sha3(newOwner) & ) == (bytes20(tokenAddress) & );
}
}
上一篇:深入了解Solidity——Assert, Require, Revert 和 Exceptions
下一篇:深入了解Solidity——可見性和Getters