編寫智慧合約
實現一個智慧合約
pragma solidity ^0.4.4;
/*
pragma: 版本宣告
solidity: 開發語言
0.4.4:當前合約主版本,0.4代表主版本,.4代表修復bug升級版本
^: 代表向上相容,0.4.4 ~ 0.4.9可以對我們當前的程式碼進行編譯
*/
//相當於 class Person extends contract
contract Person {
uint _height; //身高
uint _age; //年齡
address _owner; //代表合約的擁有者
//方法名和合約名相同時就屬於建構函式
function Person() public {
_height = 180;
_age = 29;
_owner = msg.sender;
}
function owner() public constant returns (address) {
return _owner;
}
function setHeight(uint height) public {
_height = height;
}
function height() public constant returns (uint) {
return _height;
}
function setAge(uint age) public {
_age = age;
}
function age() public constant returns (uint) {
return _age;
}
function kill() public {
if (_owner == msg.sender) {
//解構函式
selfdestruct(_owner);
}
}
}
在http://remix.ethereum.org/#optimize=false&version=soljson-v0.4.4+commit.4633f3de.js部署該合約。
部署後合約的地址就是圖示: 0x692a70d2e424a56d2c6c27aa97d1a86395877b3a
如上圖,0xdd就是我們建立合約賬號的地址,0x36就是合約的地址。會根據合約的位元組碼(input)中的資料大小,決定寫入區塊鏈需要消耗的gas。
Solidity合約中屬性和訪問許可權
**說明:**屬性的預設型別為internal
,internal
和private
型別的屬性都不能被外部訪問,當屬性的型別為public
型別時,會生成一個和屬性名相同並且返回值就是當前屬性的get函式。
比如
uint public _money;
會生成一個
function _money() constant returns (uint) {
return _money;
}
我們自己實現的get方法會覆蓋預設的方法,如下:
pragma solidity ^0.4.4;
contract Person {
uint public _money;
function _money() public pure returns (uint) {
return 100;
}
}
會返回100。
Solidity合約中屬性的訪問許可權
預設為public型別。
Solidity合約單繼承
子合約只可以繼承public型別的函式,而子合約可以繼承public和internal型別的屬性。
如下圖,public屬性被繼承,並且可見。internal型別屬性被繼承但不可見。
Solidity合約函式的重寫
Solidity值傳遞和引用傳遞
memory
值傳遞。
storage
引用傳遞。
Solidity Address型別
以太坊中地址長度為20位元組,一共160位,所以address其實亦可以用uint160來宣告。
pragma solidity ^0.4.4;
contract Test {
address _owner;
uint160 _ownerUint;
function Test() {
_owner = 0x1d9a300b7eead6edd42e01a54fcf77dda8dd8a2b;
_ownerUint = 168999232415997907000912496545158276514095925803;
}
function owner() constant returns (address) {
return _owner;
}
function ownerUint160() constant returns (uint160) {
return uint160(_owner);
}
function ownerUintToAddress() constant returns (address) {
return address(_ownerUint);
}
}
Solidity的msg.sender
pragma solidity ^0.4.4;
//第一次部署地址: 0xdfd0be3b775ce7b54eacca4c18b0d0a3a47842d3
//第二次部署地址: 0xef00a5a2e7e260156ea9eeec0ff57c0387d7b3f3
contract Test {
address public _owner;
uint public _number;
function Test() {
_owner = msg.sender;
_number = 100;
}
function msgSenderAddress() constant returns (address) {
return msg.sender;
}
function setNumberAdd1() {
_number = _number + 5;
}
function setNumberAdd2() {
if (_owner == msg.sender) {
_number = _number + 10;
}
}
function returnContractAddress() constant returns (address) {
return this; //合約地址
}
}
在上面的例項中,_owner
在部署合約的時候,建立示例並初始化為部署者的地址,後續不再改變。而msg.sender
是動態改變的,取決於每次訊息傳送者。
檢視address餘額
pragma solidity ^0.4.4;
contract getBanlance {
function getBalance(address addr) constant returns (uint) {
return addr.balance;
}
}
transfer轉賬
pragma solidity ^0.4.4;
contract PayableKeyword{
// 從合約發起方向 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址轉入 msg.value 個以太幣,單位是 wei
function deposit() payable{
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
Account2.send(msg.value);
}
// 讀取 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址的餘額
function getAccount2Balance() constant returns (uint) {
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.balance;
}
// 讀取合約發起方的餘額
function getOwnerBalance() constant returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
send轉賬
pragma solidity ^0.4.4;
contract PayableKeyword{
function deposit() payable returns (bool){
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.send(msg.value);
}
function getAccount2Balance() constant returns (uint) {
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.balance;
}
function getOwnerBalance() constant returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
相關文章
- 2.09 java編寫智慧合約Java
- 如何用 C# 編寫 NEO 智慧合約C#
- 編寫一個簡單的智慧合約
- 如何編寫一個可升級的智慧合約
- 以太坊教程:搭建環境、編寫編譯一個智慧合約編譯
- DAPP代幣預售/智慧合約/NFT質押合約系統開發/Solidity編寫APPSolid
- 互助公排滑落機制dapp系統開發|智慧合約編寫流程APP
- FDF智慧合約DApp遊戲迴圈互助系統開發程式碼編寫APP遊戲
- 使用Remix編譯和部署以太坊智慧合約REM編譯
- 保險智慧合約
- 8.4.3 編譯合約編譯
- 區塊鏈技術應用場景開發方案,智慧合約編寫服務區塊鏈
- 「Hello,Gakki」— 編寫第一份智慧合約 | 大狗教你EOS開發(四)
- 智慧合約從入門到精通:智慧合約的前世今生
- iOS 部署智慧合約iOS
- 智慧合約最佳實踐 之 Solidity 編碼規範Solid
- 從以太坊"MorphToken事件"看智慧合約建構函式大小寫編碼錯誤漏洞事件函式
- 智慧合約ARB鏈上質押挖礦系統DAPP開發解析/Solidity編寫APPSolid
- BSC/TRON/polygon鏈跨鏈多鏈dapp系統智慧合約編寫模式定製方案GoAPP模式
- 3M互助公排Dapp系統開發智慧合約編寫詳情(原始碼)APP原始碼
- 智慧合約從入門到精通:智慧合約的應用場景
- 智慧合約初體驗
- 如何實施智慧合約?
- NEO智慧合約白皮書
- 智慧合約安全性
- 什麼是智慧合約?
- 什麼是智慧合約
- 智慧合約是什麼
- Dapp 合約代幣系統開發智慧合約APP
- 智慧合約開發環境搭建及Hello World合約開發環境
- 以太坊智慧合約開發:讓合約接受轉賬
- 以太坊智慧合約開發第四篇:實現Hello World智慧合約
- 以太坊蜜罐智慧合約分析
- 3.06 EOS智慧合約(上)
- 3.08 EOS智慧合約(下)
- 2.06 hyperledger fabric智慧合約
- 什麼是智慧合約漏洞?
- 使用remix ethereum部署智慧合約REM