众筹空间(区块链技术探索)

[0240]基于JAVA的众筹智慧管理系统的设计与实现 然后结合题目要求,细化出系统所需的各个主要功能模块,并编写详细的需求规格说明书,包括但不限于项目管理、用户权限管理、支付接口集成、客服交互模块、营销推广策略、大数据统计分析、实时消息通知机制、活动策划发布、严格的项目审核流程、回报机制设定、公告信息发布、类别标签管理、个性化平台配置、热门推荐算法、财务管理模块(包括收支记录、退款处理等)、积分奖励体系、项目评价反馈、举报投诉处理、投资交易记录追溯以及合同生成管理等功能。特别是在金融风控、个性化推荐、社交互动及智能合约等方面,仍有较大的提升空间。 阅读详情

1 基础环境准备

1.1环境预览

这里写图片描述

1.2基础工程

Npm install -g truffle
Npm install -g EthereumJS TestRPC
Npm install -g supervisor
Truffle init
Npm init

这里写图片描述

1.3疑难解答

  • Web3依赖c++build tools python(only for python2.7),npm install web3会报?

Recommend:npm install --global --production windows-build-tools View
more detail:https://github.com/nodejs/node-gyp#installation能合约开发

2 智能合约开发

2.1 基础表结构

pragma solidity ^0.4.21;

/**
* 官方文档众筹实现
* https://solidity.readthedocs.io/en/develop/types.html#structs
* 1 存储方式:memory、storage,状态变量默认是storage而local变量默认是memory
* 2 mapping类似java中字典key=>value,但是没有数组常用操作:push
* 3 require类似junit中断言
* 4 函数体操作状态变量必须有修饰符,view:对状态变量读操作,payable:支付操作
* 5 msg全局变量是配合web3使用
**/
contract CrowdFunding {

    // 表结构:众筹项目
    struct Fund {
        // 众筹地址
        address owner;
        // 众筹描述
        string desc;
        // 众筹目标
        uint goal;

        // 已筹金币
        uint coins;
        // 是否结束
        bool finished;

        // 捐赠人数
        uint recordCounts;
        // 捐赠记录
        mapping(uint => Record) records;
        // 原本使用 Record[] records 数组定义
        // 但是貌似目前版本尚不支持
        // 于是将 数组 拆分成 长度 + 映射
        // https://solidity.readthedocs.io/en/develop/types.html#mappings
    }

    // 表结构:捐赠记录
    struct Record {
        // 捐赠成员
        address member;
        // 捐赠金币
        uint coin;
        // 捐赠时间
        uint time;
    }

2.2 查询操作

// 众筹地址列表
Fund[] funds;

function CrowdFunding() public payable {
}

// 获取众筹项目数量
function getFundCount() public view returns (uint) {
    return funds.length;
}

// 获取众筹项目信息
// 参数:项目编号
// 返回:众筹地址 众筹描述 众筹目标 已筹金币 是否结束
function getFundInfo(uint fundIndex) public view returns (address, string, uint, uint, bool) {
    Fund storage fund = funds[fundIndex];
    return (fund.owner, fund.desc, fund.goal, fund.coins, fund.finished);
}

// 获取众筹捐赠人数
function getRecordCount(uint fundIndex) public view returns (uint) {
    return funds[fundIndex].recordCounts;
}


// 获取众筹捐赠记录
// 参数:项目编号 记录编号
// 返回:捐赠成员 捐赠金币 捐赠时间
function getRecordInfo(uint fundIndex, uint recordIndex) public view returns (address, uint, uint) {
    Record storage record = funds[fundIndex].records[recordIndex];
    return (record.member, record.coin, record.time);
}

2.3 发起众筹

// 发起众筹:
function raiseFund(address raiser, string info, uint goal) public {
    //funds.push(Fund(msg.sender, info, goal, 0, false, 0));
    funds.push(Fund(raiser, info, goal, 0, false, 0));
}

2.4 账户支付操作

// 捐赠众筹:
// https://solidity.readthedocs.io/en/latest/miscellaneous.html#modifiers
// payable for functions: Allows them to receive Ether together with a call.
function sendCoin(uint fundIndex) public payable {
    // 默认属性
    // msg.sender 转账账户
    // msg.value 转账数目
    // 智能合约默认单位 wei
    // 1 ether = 10^18 wei

    // 引用拷贝
    Fund storage fund = funds[fundIndex];
    require(!fund.finished);

    // 转账 失败自动退出
    fund.owner.transfer(msg.value);

    // 更新众筹信息
    fund.coins += msg.value;
    fund.records[fund.recordCounts++] = Record(msg.sender, msg.value, now);
    fund.finished = fund.coins >= fund.goal * 1 ether? true : false;
}


// fallback function:回退函数 防止抛出异常
// https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function
// if you want your contract to receive Ether, you have to implement a fallback function.
function() public payable { }

3 NodeJs export众筹模型

3.1 合约编译

Truffle compile --reset
注意--reset是版本发生变化才生效,编译生成的合约\build\contracts\CrowdFunding.json

3.2 NodeJs引入abi协议、web3、truffle-contract

/**
 * 众筹业务控model
 * @author wolf
 * @time   2018-05-01
 */
var Web3 = require('web3');
var contract = require("truffle-contract");

var provider = new Web3.providers.HttpProvider("http://localhost:8545");

//使用truffle-contract包的contract()方法
var CrowdFunding = contract(
   copy编译后文件:/build/contracts/CrowdFunding.json
);

//UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Error: invalid address
//没有默认地址,会报错:务必设置为自己的钱包地址,如果不知道,查看自己的客户端启动时,观察打印到控制台的地址
CrowdFunding.setProvider(provider);
CrowdFunding.defaults({
    from : "0xeeacbf78bb5eeba49acdc67c0fbd5dd46e67facf"
});


module.exports = function () {
    this.web3 = new Web3(provider);
    this.model = CrowdFunding;
}

3.3 合约部署

Truffle migrate --reset

3.4 疑难解答

  • UnhandledPromiseRejectionWarning: Unhandled promise rejection
    (rejection id: 3): Error: invalid address
**Option 1:**
CrowdFunding.defaults({
    from : "0xeeacbf78bb5eeba49acdc67c0fbd5dd46e67facf"
});

**Option2:**
CrowdService.web3.eth.defaultAccount=account;

4 NodeJs众筹业务交互

4.1 web3交互基础信息

/**
 * 账户列表
 * @param req
 * @param res
 */
get_accountsList:function (req, res) {
    res.send(CrowdService.web3.eth.accounts)
},

/**
 * 查看区块数
 * @param req
 * @param res
 */
get_blocksList : function (req, res) {
    res.send(CrowdService.web3.eth.blockNumber);
},

/**
 * 查看默认账户/调用合约的账户
 * @param req
 * @param res
 */
post_defaultAccount: function (req, res) {

    var account = req.body.account;
    var retMsg = new Message();

    if (Checks.isNull(account)) {
        console.log("Current default: " + CrowdService.web3.eth.defaultAccount);
        res.send(retMsg.success('合约调用默认账户:'+ CrowdService.web3.eth.defaultAccount));
    } else {
        CrowdService.web3.eth.defaultAccount=account;
        res.send(retMsg.success('更新合约调用默认账户:'+ CrowdService.web3.eth.defaultAccount))
    }
},


/**
 * 查看账户余额
 * @param req
 * @param res
 */
post_accountBalance : function (req, res) {
    var account = req.body.account;
    retMsg = new Message();
    if (Checks.isNull(account)) {
        res.send(retMsg.fail('账户地址不能为空!'))
    }
    var balance = CrowdService.web3.eth.getBalance(account);
    res.send(balance)
},

4.2 众筹业务交互

/**
 * 发起众筹
 * @param req
 * @param res
 */
post_raiseFund: function (req, res) {
    var raiser = req.body.raiser;
    var info = req.body.info;
    var goal = req.body.goal;
    if (Checks.isNull(raiser)) {
        raiser = CrowdService.web3.eth.accounts[0];
    }

    CrowdService.model.deployed().then(function (instance) {
        return instance.raiseFund(raiser, info, goal, { gas: 1000000 });
    }).then(function (result) {
        console.log(result); //打印交易收据
    });

    res.send(JSON.stringify({"info" : info, "goal": goal, "code": "募集成功!"}));
},

/**
 * 捐赠众筹
 * @param req
 * @param res
 */
post_donate: function (req, res) {
    var retMsg = new Message();
    // sendCoin(uint fundIndex, address donater, uint coin)
    var fundIndex = req.body.fundIndex;
    var donater = req.body.donater;
    var coin = req.body.coin;


    /*if (Checks.isNull(fundIndex) || Checks.isNull(donater) || Checks.isNull(coin)) {
        res.send(JSON.stringify(retMsg.fail('众筹项目、捐赠账户、捐赠数量不能为空!!!')));
    }*/

    CrowdService.web3.eth.defaultAccount = donater;

    CrowdService.model.deployed().then(function (instance) {
        return instance.sendCoin(fundIndex,{value: CrowdService.web3.toWei(coin, 'ether'), from: donater, gas: 1000000 });
    }).then(function (result) {
        console.log(result); //打印交易收据
    });

    res.send(JSON.stringify(retMsg.success('捐赠成功!!!')));
},

/**
 * 众筹列表
 * @param req
 * @param res
 */
post_fundsList: function (req, res) {
    var total;
    var list = new Array();
    var g;

    CrowdService.model.deployed().then(function (instance) {
        g=instance;
        return g.getFundCount();
    }).then(function (total) {
        //promise循环
        var promoseArray=[];
        for (index=0; index < total; index++) {
            promoseArray.push(g.getFundInfo(index));
        }

        Promise.all(promoseArray).then(function (data) {
            res.send(JSON.stringify(data));
        })
    });
},

/**
 * 众筹详情
 * @param req
 * @param res
 */
post_fundInfo: function (req, res) {
    var index = req.body.index;
    CrowdService.model.deployed().then(function (instance) {
        return instance.getFundInfo(index);
    }).then(function (result) {
        res.send(result);
    });
},


/**
 * 获取捐赠记录列表
 * @param req
 * @param res
 */
post_recordsList: function (req, res) {
    var fundIndex = req.body.fundIndex;
    var g;

    CrowdService.model.deployed().then(function (instance) {
        g = instance;
        return g.getRecordCount(fundIndex);
    }).then(function (count) {
        console.log(count);
        if (count <= 0) {
            res.send("没有捐赠记录");
            return;
        }

        var promiseArray=[];
        for(x=0; x<count; x++){
            promiseArray.push(g.getRecordInfo(fundIndex, x));
        }

        Promise.all(promiseArray).then(function (data) {
            res.send(JSON.stringify(data));
        })
    });
},

4.3 基础工具

/**
 * 输出格式类
 * @type {{code: number, msg: string, data: {total: number, pageNo: number, pageSize: number, object: {}, array: Array}}}
 * @author wolf
 * @time 2018/5/1
 */

function Message () {
    this.result = {
        "code": 0,
        "msg": "操作成功",
        "data": {"total": 0, "pageNo": 1, "pageSize": 10, "object": {}, "array": []}
    };
}

Message.prototype.success = function (msg) {
    this.result.msg = msg;
    return this.result;
}

Message.prototype.fail = function (msg) {
    this.result.code = -1;
    this.result.msg = msg;
    return this.result;
}

Message.prototype.listPage = function (total, pageNo, list) {
    this.result.data.total = total;
    this.result.data.pageNo = pageNo;
    this.result.data.array = list;
    return this.result;
}

Message.prototype.setData = function (object) {
    this.result.data.object = object;
    return this.result;
}

module.exports = Message;

4.4 部署配置

var Migrations = artifacts.require("./Migrations.sol");
var Test = artifacts.require("./Test.sol");
var CrowdFunding = artifacts.require("./CrowdFunding.sol");

module.exports = function (deployer) {
    deployer.deploy(Migrations);
    deployer.deploy(Test);
    deployer.deploy(CrowdFunding);
};

4.5 疑难解答

  • Promise循环
var promiseArray=[];
for(x=0; x<count; x++){
    promiseArray.push(g.getRecordInfo(fundIndex, x));
}

Promise.all(promiseArray).then(function (data) {
    res.send(JSON.stringify(data));
})
  • Javascript prototype实现面向对象继承
Message.prototype.success = function (msg) {
    this.result.msg = msg;
    return this.result;
}
  • NodeJs静态导入
/**
 * 检查工具类
 * @author wolf
 * @time 2018/5/1
 */
function Checks() {}

    /**
     * 判断是否为空
     * @param val
     * @returns
     */
    Checks.isNull = function(val) {
        if (val == undefined || val == null || val == "" || val == ''
            || val == "undefined" || val == "null" || val == "NULL") {
            return true;
        }
        return false;
    }

module.exports = Checks;
  • Msg全局变量使用(msg.sender、msg.value)
    for crowdfunding.sol :
// 转账 失败自动退出
fund.owner.transfer(msg.value);

// 更新众筹信息
fund.coins += msg.value;
fund.records[fund.recordCounts++] = Record(msg.sender, msg.value, now);

for crowdfunding.js:

CrowdService.model.deployed().then(function (instance) {
    return instance.sendCoin(fundIndex,{value: CrowdService.web3.toWei(coin, 'ether'), from: donater, gas: 1000000 });
}).then(function (result) {
    console.log(result); //打印交易收据
});
  • 交易中total used gas = usedgas *
    gasPrice,而每次交易都需要预设gas(预估使用gas上限),使用完total used gas > gas:out of gas
    error,相反多余的gas会在交易完退换账户
  • 转账账户余额 = 默认账户总额 - msg.value - total used gas
  • msg.sender定义为调用合约账户,合约也能隐形转换为合同账户
长安链搭建区块链实战 这里尤其注意合约调用方法,这里需要把合约里的方法都写上去,这里我以IssueCredit举例,写了这么一个方法,然后它的key是companyID,carbonCoin,carbonCredit,需把这些都要写进去,将下面的图一一对应起来。具体部署合约如下,合约名称和一开始在IDE里新建的合约名称一致,合约版本自定义,虚拟机类型DOCKER_GO,合约文件则将刚刚下载的.7z后缀文件上传。这里选择合约,然后选择合约方法,输入对应信息,然后构建合约,执行合约,在模拟区块链上进行调试。 阅读详情

相关推荐

突破众筹困境“入主”区块链——先行者的力量

导读: 区块链将为众筹带来新生,也将服务于实体经济,迎来更多的创新出现,这样众筹就不再会因为各种问题止步不前,从可以而发挥其真正的作用       首先,请先观察两组关于众筹的大数据。 1. 2017年全年的成功项目数和融资总额分别为69637个和260.00亿元。 2. 世界银行报告曾预测到2025年全球募集总金额将突破960亿美元, 其中亚洲占比将大幅成长。 尽管平台数...

knowhowchain的博客 2458

区块链是不是庞氏骗局?区块链众筹骗局是怎么样的?

  区块链是不是庞氏骗局?区块链众筹骗局是怎么样的?  2018年大火的区块链,可谓称得上是家喻户晓的明星了,很多企业家趋之若鹜,众多外围者也变得心驰神往。那区块链到底是怎么赚钱的呢?实际上区块链是一种技术,是一个数据统计账簿且数据不能被篡改,数据被打包产生区块,形成区块链。实际上,区块链本身是不能赚钱的,赚钱的是技术服务和落地应用。  区块链的三个盈利化阶段  1、网站建设环节:区块链是一种网络...

swe170244的博客 5230

区块链众包测绘:24小时更新13800城的技术革命

平台架构 [[1]-[8], [10]-[13]]|数据集成 [[16]-[18]]|不间断更新 [[20]-[26]]|上海航遥技术 [[27]-[35]]|规模验证 [[36]-[39]](如上海航遥的分布式流水线),实现全球城市级三维模型的24小时更新。(如Holoveser的神经网络)与。区块链众包测绘平台通过。

百态·数智思维 | 聚焦大数据、量化与未来AI 702

几个免费的nodejs空间

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33980459的博客 1312

GIS+区块链,地理空间数据新型应用场景未来可期

在数字经济蓬勃发展的当下,区块链是繁荣数字产业生态的重要基础设施,在推动数字经济创新发展上潜力巨大,其与互联网、大数据、人工智能等信息技术深度融合,正在各行各业产生碰撞并创造价值,应用场景边界在不断拓展。而当GIS与区块链相遇,将会给地理空间数据应用带来怎样的改变呢? 例如,如果我们想购买房产,需要先寻找房源,确定产权所有人,并让合法所有人签署转让协议。这些看起来似乎很简单,可是大量房地产抵押贷款所有人、有问题的文件、伪造的签名、止赎和抵押文件损坏都让房产交易变数重重。而GIS与区块链技术的融合能很好..

smaryun的博客 1万+

广西首个校企共建区块链实验室——“桂林电子科技大学-众享科技区块链创新联合实验室”揭牌 助力产学研深入发展

今年4月,教育部关于印发《高等学校区块链技术创新行动计划》的通知提出,鼓励高校加强与行业优势企业的合作,通过共建实验室、研究中心或联合攻关等方式,积极落实“区块链技术示范应用行动”,推动区块链技术转化为企业发展活力、转化为现实生产力。 为响应教育部政策,推动产学研进一步发展,7月13日,“桂林电子科技大学-众享科技区块链创新联合实验室”在桂林电子科技大学正式揭牌成立。该实验室由桂林电子科技大学与广西众享远辰科技有限公司共同建立,是广西首个校企共建区块链实验室,也是继南京大学信息管理学院众享区块链实验室、广

Peersafe的博客 949

给 node.js 白嫖怪的5个免费托管服务

本文翻译自5 Free Ways To Host Your Node.js App In 2019 <https://amitbend.com/node.js/2019/05/1...

pshu0_0的博客 6954

意义的众筹实验室:集体探索生命价值的创新空间

通过以上目录大纲,我们构建了一个全面涵盖意义众筹实验室核心内容的框架。从基础的众筹理念与实践,到集体探索的创新实践,再到技术创新与伦理挑战,本书旨在为读者提供一个系统性的了解和深入探讨意义众筹实验室的核心内容,以及其在创新空间拓展中的挑战与机遇。本书各章节设计思路清晰,内容连贯,确保读者能够逐步掌握意义众筹的核心理念、实践方法及未来发展趋势。同时,附录部分提供实用指南与拓展阅读,帮助读者进一步深化学习。整体目录大纲简洁且逻辑性较强,字数控制在2000字以内,符合输出要求。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 636

区块链知识体系&fisco-bcos实战

区块链是黑科技,其实并没有发明新技术,是一系列技术的组合。区块链:信任的机器.

云 网 数 智 安 量子 2156

45、区块链技术在众筹平台与中小企业中的应用洞察

本文探讨了区块链技术在众筹平台和中小企业中的应用潜力及挑战。以MetaFund为例,展示了基于Polygon区块链的众筹模式及其优势,包括低交易费用和激励机制。同时,从印度视角分析了中小企业在区块链技术采用过程中面临的技术、财务和客户适应性问题,并通过解释结构模型(ISM)识别关键因素,提出实施策略。研究为中小企业制定区块链技术采用方案提供了理论依据和实践指导。

gan8painter的博客 69

12、金融科技监管沙盒与泰国股权众筹监管解析

本文探讨了金融科技监管沙盒的本质、局限性及其在中国引入的可行性分析,并深入解析了泰国在金融科技监管特别是股权众筹领域的法规框架与实践现状。文章对比了监管沙盒与泰国股权众筹监管在创新促进与风险防控之间的平衡策略,指出了各自面临的挑战,并针对泰国股权众筹市场发展提出了加强市场教育、优化监管政策、推动技术应用和建立合作机制等建议,旨在为金融创新与监管的协同发展提供参考。

a1b2c3d的博客 63

Pledgecamp:区块链赋能下一代众筹平台 | BiQuan Choice 评级

Pledgecamp是下一代众筹平台,采用区块链技术确保众筹资金的安全和责任归属明确,旨在为传统众筹行业存在的信任危机、用户激励不一致等问题提供解决方案。 主要优势 Pledgecamp团队信息披露充分、经验丰富,投资人及顾问情况优秀,将发行Pledge通证与Camp通证,采用双通证经济,使项目所有参与者能够获得同等程度的激励。资助人保险、市场网络及知识中心是项目独有的功能,能够促进众筹平台的生态...

baidu_39383304的博客 472

用朴素贝叶斯分类模型判断病人是否感染幽门螺杆菌(Python实现)

朴素贝叶斯,Python

weixin_56529327的博客 1160

股权众筹鼻祖 Naval Ravikant 发表 36 条对于区块链乃至整个世界的思考

区块链用技术设计取代权威控制和情感信任,以此建立一种网络结构,所有人都可以参与成为无数节点之一,进行认证、确权、交易、追溯和调整等一系列动作,它公开透明,成本低、速度快、分布广,没有权威可以篡改伪造和取缔记录。我们可以充分地想象今天的商业、艺术、司法、科技、政治乃至社会等各个领域中,这样一个建立在运算能力和技术架构上的网络文明社会基础设施将是多么不同。

区块链大本营 3403

Global Mapper与ArcGIS双剑合璧:自动化与半自动矢量化提取地物轮廓实战

本文详细介绍了如何结合Global Mapper的自动化批量提取与ArcGIS的半自动精细修整功能,高效完成地物轮廓矢量化工作。通过实战案例,阐述了利用Global Mapper快速抓取初步轮廓,再借助ArcGIS的ArcScan等工具进行精细化编辑和优化的完整工作流,有效提升地理信息数据处理效率。

weixin_29284657的博客 119

Dirsearch的下载、安装和使用(全)

Dirsearch工具的下载、安装和使用,超详细超全面

weixin_68416970的博客 1万+

小米生态链70迈智能后视镜上线小米众筹

小米生态链在2014年投资了27家公司,2015年28家,截止到2016年底一共投资了近80家公司。 据小米生态链联合创始人刘德回忆称,小米生态链最初的模式是和大部分投资公司一样存在,成立独立的子公司,类似顺为与小米之间的关系。但在研究了各大大企业的投资和并购方式后,生态链还是选择了以占股不控股的方式来投资公司。对此,刘德的回答显得很是哲学:“利他即利己。”而如今小米生态链成功,有力地证明了他的...

孟迎霞 优快云 163

机器人抓取(一)—— ROS MoveIt! 程序控制真实UR5机器人运动(python)

接上篇:ubuntu18.04 ros-melodic 安装 ur_robot_driver,驱动真实的 ur5 机器人 上文在 ubuntu 系统中配置了ur 机器人ros功能包 universal_robot 和驱动 Universal_Robots_ROS_Driver,并实现了用 moveit_rviz 拖动机器人运动。本文旨在学习如何使用 moveit python 用户接口moveit_commander,实现真实的ur5 机器人轨迹规划与控制。 1. ur5 机器人控制 参考:MoveIt »

zxxRobot的博客 1万+

官方乌镇定调互联网金融,P2P、众筹专项对待

官方乌镇定调互联网金融,P2P、众筹专项对待 如何在若隐若现的红线之间取得增速与安全的均衡,将是创业者和从业者今后一段时间面临的最大挑战 在发生『e租宝』这样波及面极广的危机事件之后,指望P2P乃至互联网金融行业延续之前的监管状态已经极不现实,整个互联网金融行业已经悄然来到重要的拐点期。 在12月16日的世界互联网大会上,当天下午的论坛以『互联网金融创新与发展

周红伟讲AI 957

电蚊拍为什么能秒杀蚊子?深入解析两种四倍压整流电路设计差异

本文深入解析电蚊拍秒杀蚊子的核心原理——四倍压整流电路设计,对比对称式与级联式两种方案的性能差异。通过详细电路分析、实测数据对比和选型建议,揭示高压电路设计的关键技术要点,为电子爱好者和工程师提供实用参考。

rust6ferris的博客 749

uniapp - 解决苹果ios真机运行报错:错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配(HbuilderX运行IOS手机出现问题,uniapp运行到IOS真机提示请查看是否设备未)

uni-app,ios苹果,App平台端,uniapp运行到IOS真机提示错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配,UUID在哪里,uniApp运行到ios真机报错解决,安装自定义基座App失败,没找到有计划资源,证书、标识符和描述文件,证书标识符和描述文件下面没有选项怎么回事,HBuilder真机调试报错请查看是否设备未加入到证书列表或者确认证书类型是否匹配,UniApp运行到IOS真机提示,授权的设备才可以直接安装基座,添加调试的IOS设备,在Devices中,添加手机设备UUID

🏆 前端领域优质创作者 1万+

国外区块链技术应用实例解析 2 「入门级」

“井区”公众号正式更名为“区块链前沿实验室”

渡鸦区块链 1592

Unity Sprite Atlas C++底层原理全解析 —— “像素聚合工厂”的秘密

Unity Sprite Atlas C++底层实现简析 Sprite Atlas是Unity中用于优化2D渲染性能的核心机制,其C++底层实现如同一个高效的"像素聚合工厂"。该系统通过将多个小纹理合并为一个大纹理,显著减少Draw Call次数和GPU纹理切换开销。 在数据结构上,底层采用SpriteAtlasData存储图集元数据,PackedTexture管理合并后的大纹理,SpriteFrame记录每个子精灵的位置信息,并通过哈希表实现快速查找。编辑器阶段使用最大矩形等算法优化空

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 204

水滴筹、轻松筹死磕健康保

配图来自Canva可画 2020年接近尾声之际,互联网保险新规出炉,强监管下不合格者被淘汰,行业进入强者越强阶段。 12月14日,银保监会下发《互联网保险业务监管办法》(下称《办法》),将于2021年2月1日起正式施行。《办法》规定,互联网保险业务应由依法设立的保险机构开展,其他机构和个人不得开展互联网保险业务。 这也意味着,互联网保险行业里中小玩家将会加速离场,而拥有保险牌照资质的水滴筹和轻松筹,旗下的保险业务也将迎来新的对垒局面。 健康险大跃进 健康的重要性不言而喻。 满足吃得饱、穿得暖需求之后,人们.

liukuang110的博客 532

基于STM32设计的电能质量控制系统_353

本项目基于STM32F103RCT6微控制器设计了一套电能质量控制系统,实现了对火焰、烟雾、环境温湿度、电压、电流及功率等多项参数的实时监测与报警。系统通过MQ2烟雾传感器、火焰传感器、SHT30温湿度传感器及电力参数采集模块采集数据,采用高电平触发有源蜂鸣器进行异常报警。采集的数据通过ESP8266无线模块以AP+TCP模式上传至基于Qt开发的手机APP和电脑上位机,实现远程实时监控和历史数据管理。系统配备1.44寸LCD显示屏,实现本地数据显示。软件采用Keil5开发,采用寄存器编程方式,提高系统响应速

253

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 一分钟:Nginx+Keepalived部署
下一篇: IT 职场英语技能(西式招聘JD)
架构师老狼
博客等级 码龄14年 44粉丝 57原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值