web3.js與智能合約交互


智能合約示例:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM