第二个智能合约
第二個智能合約
第一個被helloworld占掉了,所以這個是第二個, 通過智能合約實現(xiàn)幾個簡單的函數(shù),作為對solidity的初步學習
什么是智能合約
solidity官方doc
GitHub
pragma solidity ^0.4.4;contract SimpleStorage {uint storedData;function set(uint x) {storedData = x;}function get() constant returns (uint) {return storedData;} }從Solidity角度來看,合約就是存在于以太坊區(qū)塊鏈中的一個特定地址中的代碼和數(shù)據(jù)集合。uint storedData 聲明了一個類型為 uint(256位的無符號整型)的變量,變量名稱為 storedData。你可以把它想象為數(shù)據(jù)庫中的一個字段,該字段是可以被數(shù)據(jù)庫中的方法進行查詢,修改。在以太坊中,這個字段是屬于一個合約字段。在這個例子中,該變量可以通過提供的get,set方法進行獲取或是修改。在Solidity中,訪問一個變量是不需要通過this來引用的。
這個合約很簡單,只是允許以太坊上的任何人來存儲一個數(shù)據(jù)到某個節(jié)點,同時把這個操作發(fā)布到以太坊中,當然,以太坊上的其他節(jié)點同樣可以通過調(diào)用set方法來修改你已經(jīng)存儲好的值。雖然有被修改,但是對該值操作的任何歷史記錄都是保存在以太坊中的。不用擔心你的存儲記錄或是修改記錄會丟失。后面我們會將到如何對合約進行限制,只允許你一個人修改這個數(shù)據(jù)
以上內(nèi)容引用自shaotine
合約結(jié)構(gòu)
示例代碼
使用上面的示例代碼 (學習好習慣,以后的tab 就是兩個space 了,怕引起圣戰(zhàn)…)
代碼說明
版本號
pragma solidity ^0.4.4;第一行表明目前使用的solidity版本,不同版本的solidity可能會編譯出不同的bytecode。^代表兼容solidity 0.4.4~0.4.9的版本。
合約類名
contract HelloWorld {... }contract是solidity里的一個關(guān)鍵字, 相當于其他的語言中的一個特定的class。因為solidity是專為智能合約(Contract)設(shè)計的語言,聲明contract后即內(nèi)置了開發(fā)智能合約所需的功能。
合約函數(shù)
function sayHello([_in type var]) returns ([tpye]) {return ("Hello World"); //這里是返回string }solidity是函數(shù)式編程語言(類似js),但如果有傳入的參數(shù)或回傳值,需要指定參數(shù)或回傳值的類型(type)。
到這基本合約結(jié)構(gòu)說完了,試著先寫一個
第二個合約
編寫
照著上面的模板,試著寫了自己的一個 test的合約
pragma solidity ^0.4.17;contract TestContract {uint num ;address owner; // address 是 sd 里面的一種特有的類modifier onlyOwner() { // modifier 正如其字面意思修飾, 這個關(guān)鍵字用于對固有函數(shù)的 重寫(后面系統(tǒng)學習)if (msg.sender == owner) //msg是contract的固有成員, sender ,就是合約的發(fā)送者的地址_;}// 設(shè)置數(shù)function setNum(uint x) {num = x;}// 得到數(shù)function getNum() returns(uint) {return num; }// 加 這里pure 關(guān)鍵字很重要,個人理解和static 一樣, 是個靜態(tài)方法, 不能使用成員function addNum(uint a, uint b) public pure returns(uint r) {r = a + b;}//sayfunction say() public pure returns (string) {return "Hello";}//print namefunction print(string name) public pure returns (string) {return name;} }部署
之前有寫到
編譯
truffle compile --resetCompiling ./contracts/TestContract.sol... Writing artifacts to ./build/contracts完成新的合約的重新編譯
部署(遷移)
truffle migrate --resetUsing network 'development'.Running migration: 1_initial_migration.jsDeploying Migrations...... 0x714a27d42f8ae364616544905182a3f5b7dbf389db49d20863d94e2739271c91Migrations: 0x909ae0c719f6f424b405683d721e4ff8254314daDeploying TestContract...... 0xadeaec3e75f3cb3e8f70e4c1b1bca599fd7acd95bbae183ff9a513c5e7d4fa07TestContract: 0x7db773d54c25e251a6c088a3b8acf783a8a6705d Saving successful migration to network...... 0x9984265ec8aa5065453013b0df3e6223f35fab384b3919107a503f66798e4a01 Saving artifacts...在testrpc 端會顯示
Transaction: 0x9984265ec8aa5065453013b0df3e6223f35fab384b3919107a503f66798e4a01 Gas usage: 41981 Block Number: 5 Block Time: Thu Jan 25 2018 17:52:15 GMT+0800 (CST)表示我們的合約已經(jīng)被挖到(區(qū)塊確認) 新合約的部署完畢
合約交互
先進入rpc的終端
truffle consoletruffle(development)> var TestContract truffle(development)> TestContract.deployed().then(instance => contract = instance) // 這里部署合約, 并使用變量保存期返回的句柄下面是合約函數(shù)測試
truffle(development)> contract.say() 'Hello' truffle(development)> contract.addNum(12,12) BigNumber { s: 1, e: 1, c: [ 24 ] } truffle(development)> contract.print("test") 'test' truffle(development)>可見,可以正常使用合約函數(shù), 至此第二個合約完成
遇到問題
執(zhí)行 getNum函數(shù)時候, 得到不正常, 回顯是transfer的信息
truffle(development)> contract.getNum() { tx: '0x4d1893d2bde57907b3ec4d9b4929ff80d3adc2e7e92264fe3fef345a0ca7f152',receipt:{ transactionHash: '0x4d1893d2bde57907b3ec4d9b4929ff80d3adc2e7e92264fe3fef345a0ca7f152',transactionIndex: 0,blockHash: '0x2d9540781aba9d5ae963bbb1853f83b8f7ce506c5273f6b581ad9dff8f90c5f0',blockNumber: 20,gasUsed: 21688,cumulativeGasUsed: 21688,contractAddress: null,logs: [],status: 1 },logs: [] }執(zhí)行setnum的時候,也是得到的是
truffle(development)> contract.setNum(12) { tx: '0xc5c33b52e9927f6a4705317850ce4b4cb6518555dc4d9536ddc9d42ac95b0500',receipt:{ transactionHash: '0xc5c33b52e9927f6a4705317850ce4b4cb6518555dc4d9536ddc9d42ac95b0500',transactionIndex: 0,blockHash: '0xcf75f94ab4fa6d3906c16070f6e92ab4388a834c39f5f73c38cc92c0b28fbb1d',blockNumber: 21,gasUsed: 26708,cumulativeGasUsed: 26708,contractAddress: null,logs: [],status: 1 },logs: [] } truffle(development)>估計問題可能和pure關(guān)鍵字有關(guān)
但是在在線的IDE(browser-solidity)中 得到以下信息,output是有的,可是不被顯示出來
status 0x1 Transaction mined and execution succeedfrom 0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2dbto TestContract.getNum() 0x8046085fb6806caa9b19a4cd7b3cd96374dd9573gas 3000000 gastransaction cost 21688 gas execution cost 416 gas hash 0x4f29cd5e276c8ea4ec9d8f48baa44c43c7adff6ef0ca177a2cb4f2d479525b62input 0x67e0badbdecoded input {}decoded output {"0": "uint256: 23" }logs []value 0 wei問題下次解決!
學習文獻
Solidity編程 一 之智能合約的介紹
從零開始學習區(qū)塊鏈
一個關(guān)于智能合約的信仰
總結(jié)
                            
                        - 上一篇: ETH 开发环境搭建及智能合约 hell
 - 下一篇: 从 Demo 中学习 Solidity