智能合約示例:
pragma solidity ^0.5.2; contract Coin { uint public val; event Set(uint val); function set(uint _val) public { val = _val; emit Set(_val); } function get() public view returns (uint) { return val; } }
html頁面(請先下載web3.min.js,並放置在與當前html頁面同文件夾下)
<html> <head> <meta charset="UTF-8"> <title>web3.js使用</title> <script src="web3.min.js"></script> <style type="text/css"> span { display: inline-block; } </style> </head> <body> <h1>web3.js與智能合約交互</h1> <div id="info">444</div> <span> <input type="text" id="myVal"></input> <button onclick="setVal()">修改</button> </span> <script> //1、利用以太坊provider創建web3 var web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:7545")); //2、智能合約的abi,abi是由編譯器生成的 var abi = [ { "constant": true, "inputs": [], "name": "val", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "_val", "type": "uint256" } ], "name": "set", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "get", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "val", "type": "uint256" } ], "name": "Set", "type": "event" } ]; //3、根據abi獲取合約 var ZombieFactoryContract = web3.eth.contract(abi); //合約地址,發布之后在以太坊上生成的合約地址 var contractAddress = "0x18b490cddf021886af0e5f3129468533c0026da2"; //4、根據合約地址獲取合約實例 var ZombieFactory = ZombieFactoryContract.at(contractAddress); //5、監聽合約中定義的事件, 執行UI操作,合約實例能訪問合約中公共的函數以及事件 var event = ZombieFactory.Set(function(error, result) { if (error) { return } //console.log("9999"); //console.log(result.args.val.c); document.getElementById("info").innerHTML = ZombieFactory.get(); }); // function setVal(){ /** *調用合約中的函數 *方式1:不會更改狀態變量的函數調用方法 ZombieFactory.get() *方式2:會更改狀態變量的函數調用方法,需要發送交易 ZombieFactory.set.sendTransaction(函數參數, {from: web3.eth.accounts[0]}) */ ZombieFactory.set.sendTransaction(document.getElementById("myVal").value, {from: web3.eth.accounts[0]}); } </script> </body> </html>
--------------------------------------------
solidity語法:
a.sol合約文件
pragma solidity ^0.5.2; contract A { uint public x; uint public amount; constructor(uint _x) public payable { x = _x; } function get() public view returns (uint) { return x; } }
test.sol合約文件
pragma solidity ^0.5.2; import "./er.sol"; contract Coin { uint public val; A a; event Set(uint val); function set(uint _val) public { val = _val; a = new A(_val); emit Set(_val); } function get() public view returns (uint) { return val + a.get(); } }
--------------------
solidity的payable使用
payable
方法是讓 Solidity 和以太坊變得如此酷的一部分 —— 它們修飾的函數是一種可以接收以太的特殊函數。
在以太坊中, 錢 (以太), 數據 (事務負載), 以及合約代碼本身都存在於以太坊。你可以在調用函數的同時付錢給另外一個合約。
合約 OnlineStore.sol如下:
pragma solidity ^0.5.2; contract a { function get() public payable { // 檢查以確定0.001以太發送出去來運行函數 require(msg.value == 0.001 ether); // 如果requiretongguo,執行函數向調用者發送數字內容 // transferSomething(msg.sender); } }
在這里,msg.value
是可以查看向合約發送了多少以太的方法,另外 ether
是一個內建單元。
這里發生的事是,一些人會從 web3.js
調用這個函數 (從DApp的前端), 像這樣 :
// 假設 `OnlineStore` 在以太坊上指向你的合約: OnlineStore.get.sendTransaction({from: web3.eth.accounts[0], value: web3.toWei(0.001, 'ether')});//該函數返回一個256位的值,類似 0x3b57fabc53f0bc6d6dec107d3d0cea2e3409683cf105a2766bf867768c0d9cf1 這種
-----------------------------
合約本身也是一個賬戶,當我們調用合約里定義的payable函數時,就會向合約發送一定數量的以太,這些以太就保存在合約賬戶里,我們也可以從合約中將這些以太提取到指定賬戶,如下使用示例:
pragma solidity ^0.5.2; contract Coin { uint public val; event Set(uint val); address public owner; constructor() public{ owner = msg.sender; } function set(uint _val) public payable { val = _val; emit Set(_val); } function get() public view returns (uint) { return val; } function balanceOf() public view returns (uint) { return owner.balance; } function balanceOfContract() public view returns (uint) { return address(this).balance; } }
<html> <head> <meta charset="UTF-8"> <title>web3.js使用</title> <script src="web3.min.js"></script> <style type="text/css"> span { display: inline-block; } </style> </head> <body> <h1>web3.js與智能合約交互</h1> <div id="info">444</div> <div id="balance">444</div> <span> <input type="text" id="myVal"></input> <button onclick="setVal()">update</button> </span> <script> //1、利用以太坊provider創建web3 var web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:7545")); //2、智能合約的abi,abi是由編譯器生成的 var abi = [ { "constant": false, "inputs": [ { "name": "_val", "type": "uint256" } ], "name": "set", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "val", "type": "uint256" } ], "name": "Set", "type": "event" }, { "constant": true, "inputs": [], "name": "balanceOf", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "balanceOfContract", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "get", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "val", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" } ]; //3、根據abi獲取合約 var ZombieFactoryContract = web3.eth.contract(abi); //合約地址,發布之后在以太坊上生成的合約地址 var contractAddress = "0xd6358db490163053a8a8c852c6397502278d0d97"; //4、根據合約地址獲取合約實例 var ZombieFactory = ZombieFactoryContract.at(contractAddress); //5、監聽合約中定義的事件, 執行UI操作,合約實例能訪問合約中公共的函數以及事件 var event = ZombieFactory.Set(function(error, result) { if (error) { return } //console.log("9999"); //console.log(result.args.val.c); document.getElementById("info").innerHTML = ZombieFactory.get(); }); // function setVal(){ /** *調用合約中的函數 *方式1:不會更改狀態變量的函數調用方法 ZombieFactory.get() *方式2:會更改狀態變量的函數調用方法,需要發送交易 ZombieFactory.set.sendTransaction(函數參數, {from: web3.eth.accounts[0]}) */ ZombieFactory.set.sendTransaction(document.getElementById("myVal").value, {from: web3.eth.accounts[0], value: web3.toWei(0.001, 'ether')}); console.log(web3.eth.getBalance("0xa6c07AE626F0BB30Fe77f3f924c37CCa59895BAc")); } </script> </body> </html>
參考文章 https://www.jianshu.com/p/d7f620d23c5b