Solidity語言學習筆記————32、建立合約
Solidity的合約類似於面嚮物件語言中的類。它們包含存放持久化資料的狀態變數和可修改這些變數的函式。呼叫不同的合約例項上的函式將執行EVM函式呼叫,從而切換上下文,使得狀態變數不可訪問。
建立合約(Creating Contracts)
合約可以從“外部”建立,也可以由Solidity合約創立。
像Remix這類IDE,可以用UI介面使建立過程無縫連線。
最好在Ethereum上以程式設計方式通過Web3.js建立合約。到今天為止,它有一種叫做web3.eth.Contract的方法來幫助合約的建立。
當建立一個合約時,它的建構函式被執行一次。建構函式是可選的。只允許一個建構函式,這意味著不支援過載。
在內部,建構函式的引數要放在在合約程式碼編譯成的ABI之後,但是如果使用Web3.js
,則不必關心這一點。
如果是一個合約要創立另外一個合約,被創立的合約的原始碼(和二進位制程式碼)要能被創立者知曉。這意味著迴圈建立依賴就成為不可能的事情。
pragma solidity ^0.4.16;
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) & 0xff) == (bytes20(tokenAddress) & 0xff);
}
}
相關文章
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- Solidity語言學習筆記————44、合約的後設資料Solid筆記
- Solidity語言學習筆記————1、初識Solidity語言Solid筆記
- Solidity語言學習筆記————38、Solidity彙編Solid筆記
- Solidity語言學習筆記————31、智慧合約的基本檔案結構概述Solid筆記
- Solidity語言學習筆記————36、 庫Solid筆記
- Solidity語言學習筆記————37、Using forSolid筆記
- Solidity語言學習筆記————4、常量Solid筆記
- Solidity語言學習筆記————33、事件(Events)Solid筆記事件
- Solidity語言學習筆記————12、陣列Solid筆記陣列
- Solidity語言學習筆記————34、繼承Solid筆記繼承
- Solidity語言學習筆記————43、安全考量Solid筆記
- Solidity語言學習筆記————42、提示和技巧Solid筆記
- Solidity語言學習筆記————28、純函式Solid筆記函式
- Solidity語言學習筆記————26、回退函式Solid筆記函式
- Solidity語言學習筆記————16、對映MappingSolid筆記APP
- Solidity語言學習筆記————41、記憶體佈局Solid筆記記憶體
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- Solidity語言學習筆記————25、作用域和宣告Solid筆記
- Solidity語言學習筆記————27、檢視函式Solid筆記函式
- Solidity語言學習筆記————10、布林型、整型Solid筆記
- Solidity語言學習筆記————3、Remix的基本使用Solid筆記REM
- Solidity語言學習筆記————15、結構體StructSolid筆記結構體Struct
- Solidity語言學習筆記————18、字串和函式Solid筆記字串函式
- Solidity語言學習筆記————14、左值運算子Solid筆記
- Solidity語言學習筆記————9、左值運算子Solid筆記
- Solidity語言學習筆記————17、原始檔對映Solid筆記
- Solidity語言學習筆記————5、全域性變數Solid筆記變數
- Solidity語言學習筆記————2、使用編譯器Solid筆記編譯
- Solidity語言學習筆記————30、函式過載Solid筆記函式
- 智慧合約語言 Solidity 教程系列8 - Solidity APISolidAPI
- 智慧合約語言 Solidity 教程系列8 – Solidity APISolidAPI
- Solidity語言學習筆記————26、Assert, Require, Revert 和 ExceptionsSolid筆記UIException
- Solidity語言學習筆記————22、可見性和GettersSolid筆記
- Solidity語言學習筆記————20、函式修飾符Solid筆記函式
- Solidity語言學習筆記————23、函式呼叫和賦值Solid筆記函式賦值
- Solidity語言學習筆記————24、輸入輸出引數Solid筆記
- Solidity語言學習筆記————13、固定大小位元組陣列Solid筆記陣列