智能合約示例:
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
