惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
量子位
S
SegmentFault 最新的问题
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Threat Research - Cisco Blogs
I
Intezer
Hugging Face - Blog
Hugging Face - Blog
Spread Privacy
Spread Privacy
Microsoft Security Blog
Microsoft Security Blog
P
Proofpoint News Feed
Know Your Adversary
Know Your Adversary
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
Cyberwarzone
Cyberwarzone
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
Jina AI
Jina AI
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
AWS News Blog
AWS News Blog
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
T
Threatpost
大猫的无限游戏
大猫的无限游戏
I
InfoQ
T
Tor Project blog
Project Zero
Project Zero
F
Full Disclosure
L
Lohrmann on Cybersecurity
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
The Hacker News
The Hacker News
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
V2EX
The Cloudflare Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security

希仁之拥

领克900半年使用体验 | 希仁之拥的博客 Ubuntu 26.04 Desktop使用体验 | 希仁之拥的博客 【转载】谈谈不受欢迎的博客技术特征 | 希仁之拥的博客 【转载】ClaudeCode 你想知道的所有秘密,源码深度研究报告 | 希仁之拥的博客 2025年年终总结 | 希仁之拥的博客 集成和使用Openclaw后的思考 | 希仁之拥的博客 我买了领克900 | 希仁之拥的博客 服务器性能优化之io拷贝 | 希仁之拥的博客 Go-Sail导航站上线啦 | 希仁之拥的博客 今年国庆的一些感受 [2025] | 希仁之拥的博客 在Deepin 25上配置forticlient | 希仁之拥的博客 分享一些酷酷的站点 [20250908] | 希仁之拥的博客 Go-Sail发布v3.0.6版本了 | 希仁之拥的博客 我对V2EX发布$V2EX讨论的一些感受 | 希仁之拥的博客 如何让Stripe支持支付宝和微信支付 | 希仁之拥的博客 2025上半年里程碑 | 希仁之拥的博客 GitLab+Drone使用体验 | 希仁之拥的博客 四姑娘山之旅 | 希仁之拥的博客 近来帮同事做性能优化的过程回顾 | 希仁之拥的博客 聊聊接口的返回数据结构 | 希仁之拥的博客 由GORM的Updates语法糖 我把 Go-Sail 的文档站更新了 | 希仁之拥的博客 这就是我为什么讨厌拼多多 | 希仁之拥的博客 元旦快乐~ | 希仁之拥的博客 致敬还在写博客的我们 | 希仁之拥的博客 逐步的把图片资源迁移到星光图床上 | 希仁之拥的博客 帮弟弟配了一台mini主机 | 希仁之拥的博客 国庆的一些碎碎念 | 希仁之拥的博客 就这一刻而言,我觉得科技冷冰冰的。 | 希仁之拥的博客 如何使用acme.sh自动续签证书 | 希仁之拥的博客 Go-Sail的文档站点搭建好了 | 希仁之拥的博客 我的第一个谷歌浏览器插件发布成功啦! | 希仁之拥的博客 我开源了一个golang的web框架 | 希仁之拥的博客 流芳 | 希仁之拥的博客 第一次开发微信小程序 | 希仁之拥的博客 春节快乐 | 希仁之拥的博客 我把博客站点重写了 | 希仁之拥的博客 阆中古城 | 希仁之拥的博客 入了把Keydous NJ80 | 希仁之拥的博客 Mac上有用的知识 | 希仁之拥的博客 记一次服务器被攻击 | 希仁之拥的博客 Ubuntu server不停机扩容系统盘 | 希仁之拥的博客 端午安康 | 希仁之拥的博客 搭建hadoop伪分布式集群总结 | 希仁之拥的博客 在goa框架中,如何访问原始请求数据 | 希仁之拥的博客 postgresql相关操作笔记 | 希仁之拥的博客 golang解析带命名空间的xml数据(带冒号的节点或属性名) | 希仁之拥的博客 【转载】解决deepin环境下wine QQ无法接收图片问题 | 希仁之拥的博客 杂项笔记 | 希仁之拥的博客 Mac如何修改通知横幅消失时间 | 希仁之拥的博客 Golang校验结构体是否实现了接口 | 希仁之拥的博客 关于deepin os的大半年使用体验 | 希仁之拥的博客 有态度的翻唱 | 希仁之拥的博客 【转载】Golang 在 Mac、Linux、Windows 下如何交叉编译 | 希仁之拥的博客 和幺幺一起成长的半年时光 | 希仁之拥的博客 Element UI中message消息提示实现原理 | 希仁之拥的博客 从predis组件开始了解如何与redis服务交互 | 希仁之拥的博客 【转载】 尤雨溪谈Vue.js :缔造自由与真我 | 希仁之拥的博客 【转载】百万 Go TCP 连接的思考: epoll方式减少资源占用 | 希仁之拥的博客 【分享】移除git中的commit历史(保留文件,仅移除提交历史信息) | 希仁之拥的博客 shell学习笔记 | 希仁之拥的博客 【分享】Ruby 之父松本行弘:程序员的乐趣、存在感与平衡 | 希仁之拥的博客 安利一下我用过的一些sublime text 3工具、插件及配置 | 希仁之拥的博客 PHP处理苹果内购数据验证 | 希仁之拥的博客 PHP获取XML所有节点名称 | 希仁之拥的博客 Sentinel::check() 在Laravel5.3版本之后总是返回false的解决方案 | 希仁之拥的博客 吃货的美食集,持续更新~ | 希仁之拥的博客 第二十一届成都汽车博览会 | 希仁之拥的博客 马云宣布1年后卸任集团董事局主席 由CEO张勇接任 | 希仁之拥的博客 nginx配置非443端口的https连接 | 希仁之拥的博客 PHP7 异常类型列表 | 希仁之拥的博客 【分享】《燃点》:不被嘲笑的愿望是不值得去实现的|一部属于创业者的电影 | 希仁之拥的博客 【分享】前端资源加载优先级[译] | 希仁之拥的博客 【小技巧】Laravel动态配置多个数据库连接 | 希仁之拥的博客 php使用ftp上传、下载文件 | 希仁之拥的博客 php使用mysqlnd扩展进行mysql异步并行查询 | 希仁之拥的博客 Smartisan OS | 希仁之拥的博客 母校 | 希仁之拥的博客 php后期静态绑定 | 希仁之拥的博客 [mysql优化]子查询与连接查询 | 希仁之拥的博客 PHP常见运行模式及原理 | 希仁之拥的博客 mysql用户与授权 | 希仁之拥的博客 如何在ubuntu14.04上安装composer | 希仁之拥的博客 关于mews/captcha for laravel存在method [validateCaptcha] doesn't exists解决方法 | 希仁之拥的博客
基于以太坊区块链,使用web3.js在geth服务器上执行合约方法以及事件监听 | 希仁之拥的博客
希仁之拥 · 2018-06-27 · via 希仁之拥

写在最前:以下所有代码基于web3.js与geth交互使用websocket方式, 版本:1.1.0-beta.22测试通过并已成功在生产环境运行

1.启动geth服务器

geth --datadir /path/to/datadir/ --rpc --rpcapi db,eth,net,personal,web3 --ws --wsapi db,eth,net,personal,web3 --wsorigins=*

2.web3.js连接geth服务器

2.1首先使用合约部署后得到的json文件

connect.js

exports.getWeb3AndContract = (name) => {
    const Web3 = require("web3");
    const fs = require("fs");
    var address = "contract address";//合约地址,发布合约后得到的地址
    var contractFileContent = JSON.parse(fs.readFileSync("path/to/contract.json"));
    var web3 = new Web3();
    web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"));
    var contract = new web3.eth.Contract(contractFileContent.abi, address);
    return {"web3":web3, "contract":contract};
}

2.2编写合约方法、合约事件

method.js

exports.RollLottery = function (contract, web3, taskGuid) {
    web3.eth.getCoinbase().then((resp) => {
                console.log("get current gas price");
                web3.eth.getGasPrice((err, res) => { //获取当前的gasPrice
                    var currentGasPrice = 0;
                    if (err === null) {
                        console.log("current gas price is: " + res);
                        currentGasPrice = res * 5;
                    }
                    console.log("[RollLottery]");
                    contract.methods.RollLottery(taskGuid) //taskGuid,你的执行参数,注意数据类型必须和合约内对应方法的参数类型一致,否则会发生错误
                        //.send({from:resp,value:web3.utils.toWei(payNumber, 'ether'), gas:150000})
                        .send({from:resp,value:0, gasPrice:currentGasPrice,gas:150000})
                        .once('transactionHash', (hash)=>{
                                                        //当合约正确执行后,这里会返回合约执行后生成的hash值
                            console.log('once transactionHash: ' + hash);
                        })
                        .once('receipt', (receipt)=>{
                            //console.log("once receipt: " + receipt);
                        })
                        .on('confirmation', (confNumber, receipt)=>{
                                                        //当合约执行发出的区块被矿工挖出并确认时,这里会有返回值
                            //console.log("on confirmation: " + confNumber);
                            //console.log("on confirmation:");
                            //console.log(receipt);
                        })
                        .on('error', (error)=>{
                                                        //合约执行失败,这里会有返回值
                            console.log('on error: ' + error);
                        })
                            .then(function(result, error){
                                                        //错误发生时的异常捕获   
                            // console.log("error:");
                            // console.log(error);
                            // console.log("result:");
                            // console.log(result);

                                                });
                }).then((ex) => {
                                        //获取当前gasPrice的错误异常捕获
                    console.log("ge current gas price error: " + ex);
                });       
            }).catch((err)=>{console.log('getCoinbase error: ' + err);});    
}

watch.js

exports.LotteryLogRandNumberBC = (web3, contract) => {
    var _this = this;
    contract.events.LogRandNumberBC({fromBlock:"latest", toBlock:"latest"})
    .on('data', (event) => {
                //event.returnValues将会是一个json对象,里面包含合约中事件返回值,注意,键名和合约中的变量名称完全一致。
        console.log("[(Lottery)LogRandNumberBC Event] on data event: (returnValues)");
        console.log(event.returnValues);
        var taskGuid = event.returnValues.taskID;
        var winNumber = event.returnValues.randomNum;
        var txHash = event.transactionHash;
        //todo something.
    })
    .on('changed', (event) => {
        // console.log("[(Lottery)LogRandNumberBC Event] on changed event:");
        // console.log(event);
    })
    .on('error', (error) => {
        console.log("[(Lottery)LogRandNumberBC Event] on error:");
        console.log(error);
    });
    return false;
};

2.3调用合约方法

lottery_server.js

//引入connect.js
const web3AndContract = require("connect");
//引入合约方法
const Methods = require("method");
//初始化连接
var lottery = web3AndContract.getWeb3AndContract("lottery");
//调用合约方法
blackJackAllMethods.RollLottery(lottery.contract, lottery.web3, taskGuid);

执行合约方法部分数据返回:

method result

2.4开始监听合约事件

lottery_watcher.js

//引入connect.js
const web3AndContract = require("connect");
//引入合约事件
const lotteryAllWatchers = require("watch");
//初始化合约事件
var lottery = web3AndContract.getWeb3AndContract("lottery");
//调用合约事件,开始监听
lotteryAllWatchers.LotteryLogRandNumberBC(lottery.web3, lottery.contract);

监听合约事件部分数据返回:

event result

注意:执行监听任务时,脚本将处于等待接收消息状态,建议使用守护进程方式以后台形式运行。

3.部分合约代码(solidity)

pragma solidity ^0.4.2;


contract Lottery {

    /*
     * checks only owner address is calling
    */
    modifier onlyOwner 
    {
        require(msg.sender == owner);
         _;
    }

    /*
     * game vars
    */
    address public owner;

    uint private randomNumber;  //上一次的randomNumber会参与到下一次的随机数产生

    /*
     * events
    */
    event LogRandNumberBC(uint64 taskID,uint16 randomNum); //这里是event事件定义,当事件执行后,"taskID、randomNum"数据将会被返回

    /*
     * init
    */
    constructor() public {
        owner = msg.sender;
    }

    function RollLottery(uint64 taskID) public
        onlyOwner
    {
        uint16 randResult;

        randomNumber     = uint(keccak256(randomNumber,taskID,block.difficulty)) * uint(blockhash(block.number - 1));
        randResult         = uint16(randomNumber % 1000);

        emit LogRandNumberBC(taskID,randResult);
    }


    function ()
        public payable
    {
        return;
    }


    /* only owner address can set owner address */
    function ownerChangeOwner(address newOwner) public
        onlyOwner
    {
        owner = newOwner;
    }

    /* only owner address can suicide - emergency */
    function ownerkill() public
        onlyOwner
    {
        selfdestruct(owner);
    }

}

4.在区块链服务器上查看合约运行情况

以太坊区块链有两个环境地址:一个测试地址,一个正式地址

  • 测试地址: https://ropsten.etherscan.io,访问https://ropsten.etherscan.io/tx/你的方法或事件hash,可以查询结果
  • 正式地址: https://etherscan.io ,访问https://etherscan.io/tx/你的方法或事件hash,可以查询结果

5.更多web3.js文档

https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html

转载请注明原文地址:https://blog.keepchen.com/a/using-web.js-over-Ethernet-block-chain.html