关于solidity:Solidity案例详解四投票智能合约

该合约为原创合约,性能要求如下在⼀定工夫能进⾏投票超过工夫投票截⽌,并投同意票超过50%则为通过。 使⽤safeMath库,使⽤Owner 第三⽅库领有参加投票权的⽤户在创立合约时确定Voter 构造 要有工夫戳、投票是否批准等;struct 构造体 Proposal 提案 提案编号、提案工夫、提案内容、提案⼈、提案截⽌工夫、后果等。Voter 投票 投票工夫 、态度等(也能够减少委托投票)性能(必要性能)vote 投票 getResult 后果事件 Vote Result 产⽣后果首先咱们来测试其性能1.抉择三个投票账户进行部署 2.各函数性能概述constructor: 构造函数用于初始化合约。接管一个蕴含初始选民地址的数组,将这些地址增加到 eligibleVoters 映射中,示意这些地址是适合的选民。submitProposal: 提交提案的函数。只有适合的选民能力提交提案。该函数创立一个新的提案对象,将其存储在 proposals 映射中。vote: 进行投票的函数。只有适合的选民能力投票,且投票工夫必须在提案截止工夫之前。投票后果存储在 votes 映射中,并更新提案的赞成和拥护数量。getResult: 获取提案后果的函数。只有在投票截止工夫之后能力调用该函数。计算赞成票的百分比,并判断提案是否通过,而后更新提案的状态并触发相应的事件。getNextProposalId: 公有函数,用于生成下一个提案的惟一标识符。在示例中,它总是返回1,理论利用中可能须要更简单的逻辑3.提交提案4.投票 账号1,2,3别离投票5.依据提案查看后果未点击getResult点击getResult6.依据用户地址查看用户投票状况版权申明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接和本申明。原文链接:https://blog.csdn.net/2302_77339802/article/details/134370557文章起源:CSDN 博主「发愣...」文章原题目:《Solidity案例详解(四)投票智能合约》旨在流传区块链相干技术,如有侵权请与咱们分割删除。

March 1, 2024 · 1 min · jiezi

关于solidity:Solidity案例详解三飞机管理合约

Roles角色合约(次要为前面的保险公司C提供环境) // SPDX-License-Identifier: 3.0 pragma solidity ^0.8.20; library Roles { struct Role { mapping (address => bool) bearer; } function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; }//查问增加的账户是否为空 function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; }//减少账户 function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; }//删除账户}}.AirlineV.sol航空公司合约 ...

February 26, 2024 · 1 min · jiezi

关于solidity:matic马蹄链超级MMM互助dapp系统开发模式以及源代码详情

智能合约是一个运行在以太坊链上的一个程序,它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。 智能合约也是一个以太坊帐户,咱们称之为合约帐户。这意味着它们有余额,能够成为交易的对象。 然而,超级MMM(3M)互助零碎开发对接唯hkkf5566,他们无奈被人操控,他们是被部署在网络上作为程序运行着。个人用户能够通过提交交易执行智能合约的某一个函数来与智能合约进行交互。 智能合约能像惯例合约一样定义规定,并通过代码主动强制执行。 默认状况下,您无奈删除智能合约,与它们的交互是不可逆的 Palkeoramix decompiler.def storage:owner is addr at storage 0stor1 is addr at storage 1stor2 is addr at storage 2stor3 is uint8 at storage 3stor3 is uint8 at storage 3 offset 160stor3 is uint8 at storage 3 offset 168stor3 is uint8 at storage 3 offset 176stor3 is uint8 at storage 3 offset 184stor3 is uint8 at storage 3 offset 192stor3 is uint64 at storage 3 offset 200stor3 is addr at storage 3stor4 is addr at storage 4stor5 is addr at storage 5stor6 is addr at storage 6stor7 is addr at storage 7stor8 is mapping of uint8 at storage 8def owner(): # not payablereturn ownerdef unknownc7e21014(addr _param1): # not payablereturn bool(stor8[addr(_param1)]) ...

March 30, 2023 · 4 min · jiezi

关于solidity:NFT代币质押分红dapp系统开发功能逻辑技术分析

NFT的图片、音视频等资源须要有个存储空间,咱们个别会应用IPFS。 星际文件系统IPFS(Inter-Planetary File System)是一个面向寰球的、点对点的分布式版本文件系统,零碎开发对接v+hkkf5566指标是为了补充(甚至是取代)目前统治互联网的超文本传输协定(HTTP),将所有具备雷同文件系统的计算设施连贯在一起。原理用基于内容的地址代替基于域名的地址,也就是用户寻找的不是某个地址而是贮存在某个中央的内容,不须要验证发送者的身份,而只须要验证内容的哈希,通过这样能够让网页的速度更快、更平安、更强壮、更长久。 idToOwner保护了谁领有什么通证,映射关系是通证ID到其所有者地址;idToApproval保护了谁被受权操作某个通证,映射关系是通证ID到被受权操作的地址;ownerToNFTokenCount保护了某个地址所领有的nft总量,映射关系是用户地址到代表总量的整数;ownerToOperators保护了某个地址是否受权给了另外一个地址; 一个次要的modifier是canOperate: // 查看是否具备操作某个nft的权限modifier canOperate(uint256 _tokenId){// 找到对应token的所有者address tokenOwner = idToOwner[_tokenId];require(// 须要操作者是所有者或者被所有者受权tokenOwner == msg.sender || ownerToOperatorstokenOwner,// 否则返回谬误NOT_OWNER_OR_OPERATOR);_;}同时,ERC-721还反对可选的实现项,metadata extension,次要用以返回NFT的形容信息。 ERC-1155ERC-1155同下面的形容,因为实现了“打包”的性能,所以ERC-1155的大部分函数都反对batch的操作。相比于ERC-721,ERC-1155有很好的效率晋升。

March 8, 2023 · 1 min · jiezi

关于solidity:NFT数字藏品盲盒挖矿链游系统开发智能合约源代码

NFT盲盒是什么意思? 正如玩家所说,你永远猜不到盒子外面是什么。这就是魅力所在。投合了公众的心理,谋求未知的刺激。当初盲盒也开始转移到线上,再次掀起浪潮。 就拿当初的NFT我的项目与盲盒联合举例来说,盲盒与挖矿的联合保障了我的项目的稳固倒退和社区的继续生机。我的项目通过DeFi生态系统上流动性、产量矿池和NFT的独特性将其与盲盒游戏模式联合。 盲盒游戏软件开发I34-合约I633-部署53I9的最大特点是写在智能合约上,保障公开通明,盲盒一旦满足相应的开奖条件后,点击立刻开奖,开奖后果便曾经生成,无奈纂改。因为智能合约自身与其执行过程都是可察看的,反对监管和可信,智能合约中波及的所有各方都确信该合同是以100%中立和无偏见的形式执行的,不会有欺诈、操纵或未经受权的批改危险。 合约局部 首先将本次合约局部的源码间接粘贴在remix中进行编译。源码如下: pragma solidity ^0.8.10; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";import "@openzeppelin/contracts/access/Ownable.sol";import "@openzeppelin/contracts/utils/Strings.sol"; contract NftMeta is ERC721Enumerable, Ownable { using Strings for uint256; // 是否准许nft开卖-开关 bool public _isSaleActive = false; // 初始化盲盒,等到肯定机会能够随机开箱,变成true bool public _revealed = false; // nft的总数量 uint256 public constant MAX_SUPPLY = 10; // 铸造Nft的价格 uint256 public mintPrice = 0.3 ether; // 铸造的钱包最多只能有一个nft数量 uint256 public maxBalance = 1; // 一次mint的nft的数量 uint256 public maxMint = 1; // 盲盒开关关上后,须要显示开箱的图片的base地址 string baseURI; // 盲盒图片的meta,json地址,后文会提到 string public notRevealedUri; // 默认地址的扩大类型 string public baseExtension = ".json"; mapping(uint256 => string) private _tokenURIs; // 结构器 constructor(string memory initBaseURI, string memory initNotRevealedUri) ERC721("Nft Meta", "NM") // 实现了ERC721的父类结构器,是子类继承的一种实现形式 { setBaseURI(initBaseURI); setNotRevealedURI(initNotRevealedUri); } // 内部地址进行铸造nft的函数调用 function mintNftMeta(uint256 tokenQuantity) public payable { // 校验总供应量+每次铸造的数量<= nft的总数量 require( totalSupply() + tokenQuantity <= MAX_SUPPLY, "Sale would exceed max supply" ); // 校验是否开启开卖状态 require(_isSaleActive, "Sale must be active to mint NicMetas"); // 校验铸造的钱包地址中的nft的数量 + 本次铸造的数量 <= 该钱包最大领有的nft的数量 require( balanceOf(msg.sender) + tokenQuantity <= maxBalance, "Sale would exceed max balance" ); // 校验本次铸造的数量*铸造的价格 <= 本次音讯附带的eth的数量 require( tokenQuantity * mintPrice <= msg.value, "Not enough ether sent" ); // 校验本次铸造的数量 <= 本次铸造的最大数量 require(tokenQuantity <= maxMint, "Can only mint 1 tokens at a time"); // 以上校验条件满足,进行nft的铸造 _mintNftMeta(tokenQuantity); } // 进行铸造 function _mintNftMeta(uint256 tokenQuantity) internal { for (uint256 i = 0; i < tokenQuantity; i++) { // mintIndex是铸造nft的序号,依照总供应量从0开始累加 uint256 mintIndex = totalSupply(); if (totalSupply() < MAX_SUPPLY) { // 调用erc721的平安铸造办法进行调用 _safeMint(msg.sender, mintIndex); } } } // 返回每个nft地址的Uri,这里蕴含了nft的整个信息,包含名字,形容,属性等 function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); // 盲盒还没开启,那么默认是一张彩色背景图片或者其余图片 if (_revealed == false) { return notRevealedUri; } string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString(), baseExtension)); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } //only owner function flipSaleActive() public onlyOwner { _isSaleActive = !_isSaleActive; } function flipReveal() public onlyOwner { _revealed = !_revealed; } function setMintPrice(uint256 _mintPrice) public onlyOwner { mintPrice = _mintPrice; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setMaxBalance(uint256 _maxBalance) public onlyOwner { maxBalance = _maxBalance; } function setMaxMint(uint256 _maxMint) public onlyOwner { maxMint = _maxMint; } function withdraw(address to) public onlyOwner { uint256 balance = address(this).balance; payable(to).transfer(balance); }}

March 1, 2023 · 3 min · jiezi

关于solidity:web30社交平台投票系统开发智能合约部署源代码详情DAO

“Web3”指的是“基于区块链的去中心化在线生态系统”。 2021 年,Web3 的想法开始风行。到 2021 年底,特地趣味激增,这次要是因为加密货币爱好者的趣味以及出名技术专家和公司的投资 Web3 的外围显着特色是商业模式的去中心化。从这个意义上说,它标记着互联网的第三阶段(因而称为“Web3”)和用户以后现状的逆转。 Web3 是下一次迭代,它可能会颠覆这种势力构造,将其转移回用户。凋谢规范和协定能够回归。其目标是管制不再集中在大型平台和聚合器中,而是通过“无需许可”的去中心化区块链和智能合约宽泛散布。 这在实践中意味着什么?从实质上讲,它能够开发I34-合约I633-部署53I9通过将去中介化作为外围因素,标记着数字利用商业模式的范式转变。在数据、性能和价值方面可能不再须要中介。用户和创作者能够占据下风,并且通过开源而不是专有应用程序,将有能源进行翻新、测试、构建和扩大。 HTML的代码如下: <html><head> <title>Hello World DApp</title> <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'> <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' type='text/css'></head><body class="container"><h1>A Simple Voting Application</h1><div class="table-responsive"> <table class="table table-bordered"> <thead> <tr> <th>Candidate</th> <th>Votes</th> </tr> </thead> <tbody> <tr> <td>Alice</td> <td id="candidate-1"></td> </tr> <tr> <td>Bob</td> <td id="candidate-2"></td> </tr> <tr> <td>Cary</td> <td id="candidate-3"></td> </tr> </tbody> </table></div><input type="text" id="candidate" /><a href="#" onclick="voteForCandidate()" class="btn btn-primary">Vote</a></body><script src="https://cdn.jsdelivr.net/npm/web3@0.20.1/dist/web3.js"></script><script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script><script src="./app.js"></script></html>再新建一个js文件命名为app.js,js代码如下: abi = JSON.parse('[{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"totalVotesFor","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"validCandidate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"votesReceived","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"candidateList","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"voteForCandidate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"candidateNames","type":"bytes32[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]')VotingContract = web3.eth.contract(abi);//部署的合约地址contractInstance = VotingContract.at('0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');candidates = {"Alice": "candidate-1","Bob": "candidate-2","Cary":"candidate-3"}function voteForCandidate() { console.log(candidate); candidateName = $("#candidate").val(); console.log(candidateName); contractInstance.voteForCandidate(candidateName, {from: web3.eth.accounts[0]}, function() { let div_id = candidates[candidateName]; console.log(contractInstance.totalVotesFor.call(candidateName).toString()); $("#" + div_id).html(contractInstance.totalVotesFor.call(candidateName).toString()); }); console.log(contractInstance.totalVotesFor.call(candidateName).toString());}$(document).ready(function() { candidateNames = Object.keys(candidates); for (var i = 0; i < candidateNames.length; i++) { let name = candidateNames[i]; let val = contractInstance.totalVotesFor.call(name).toString() $("#" + candidates[name]).html(val); }});

March 1, 2023 · 1 min · jiezi

关于solidity:NFT碎片化系统开发功能与流程详细介绍

什么是碎片化NFT?碎片化NFT,它使人们可能领有 NFT 的一部分,以加重经济负担。这种碎片化的过程容许通过与原始 NFT 绑定的一组可代替代币来共享 NFT 的所有权。 从艺术家或所有者的角度来看,NFT 是一种独特的数字资产,存在于区块链上——例如艺术品、音乐或收藏品——它容许艺术家将他们的创作货币化。容许用户将 NFT 合成为具备各种用例的较小的可代替碎片。 NFT 碎片化格局依然绝对较新,并且仍处于 NFT 采纳的极晚期阶段,但毫无疑问,碎片化 NFT 显然是一个革命性的概念和一直变动的 NFT 世界。新型 NFT 呈现在新的用例中,NFT 最后是作为数字收藏品、游戏物品、音乐和艺术品。然而,这仅仅是个开始。金融 NFT 正在寻找新的用例,例如代表保险单和流动性提供者头寸。 NFT 是新 NFT 金融生态系统的一部分。NFT-Fi 代表去中心化金融 (DeFi),只是将 DeFi 利用于 NFT 和 NFTs(非同质代币是与数字或实物资产相干的区块链上的记录),NFT 与代币不同,它们是建设在以太坊等区块链上的独特数字资产,fNFT代表fractionalized NFT,属于NFT-Fi类型。 碎片化NFT ( fNFT)NFT-Fi为收藏家开释了大量的口头,这些新的口头之一是fNFT,它们带来了拜访和领有NFT的新形式。碎片化 NFT 是由其原始所有者拆分成更小局部的 NFT。通过碎片化NFT,所有权作为一个社区或独特所有权独特存在。 因而,碎片化 NFT 是将 NFT 分解成更小的局部以独自发售。每个局部代表 NFT 所有权的一部分,使一个社区可能领有一个代币。因而,从买家的角度来看,这种类型的 NFT 使人们可能领有本来无奈累赘的 NFT 的一部分,随着 NFT 价值的回升,碎片化使集体投资者可能取得高价值 NFT 或一篮子 NFT 的较小股份.从作者、艺术家或所有者的角度来看,能够在不齐全发售 NFT 的状况下开释局部价值。当资产价值十分高(数千欧元)时,能够将它们分成更多的流动性并用作抵押品。 如何碎片化NFT当 NFT 被宰割时,原始 NFT 被锁定在保险库中。只管 ERC-721 和 ERC-1155 是两个最常见的以太坊规范,然而要创立山寨币或其余同质化代币,ERC-20 是被应用的规范。 ...

February 28, 2023 · 1 min · jiezi

关于solidity:佛萨奇20NFT矩阵公排dapp系统开发源代码部署详细介绍

<aside class="sidebar collapsible canvas-left"> <div class="scroll-menu"> <nav class="main-navigation slimscroll" data-height="auto" data-size="4px" data-color="#ddd" data-distance="0">疾速开发搭建卫星hkkf5566 <ul id="left-menu"> <li class="dropdown"> <a href="javascript:;" data-toggle="dropdown"> <i class=""></i><span>合约治理</span><i class="toggle-accordion"></i> </a> <ul class="dropdown-menu"> <li 1 class="active" > <a href="/index.php/admin/Pledge/nftlist"> <span>NFT列表</span> <li 1 class="active" > <a href="/index.php/admin/Pledge/pledgelist"> <span>入金列表</span> <a href="/index.php/admin/config/contractRead"> <span>合约查问</span> </style><script src="/admin/js/laydate/laydate.js"></script><section class="panel"> <header class="panel-heading"> <h4>NFT列表</h4></header><div class="panel-body" style="padding-bottom: 50px"> <form class="form-horizontal" action=""> <div class="form-group"> <!--<div class="col-xs-1 no-pd-r"> <select id="is_lock" name="is_lock" class="form-control"> <option value="0">状态</option> <option value="1">工作中</option> <option value="2">进行工作</option> </select> </div>--> <div class="col-xs-1 no-pd-r"> <select name="type" id="type" class="form-control"> <option value="address">钱包地址</option> <!--<option value="imtoken_address">钱包地址</option>--> </select> </div> <div class="col-xs-3 no-pd-l"> <input type="text" id="keyword" value="" name="keyword" class="form-control" placeholder="请输出关键词搜寻"> </div> <div class="col-xs-2 no-pd-2"> <input type="text" value="" name="startTime" id="startTime" class="form-control" placeholder="请输出开始工夫"> </div> <div class="col-xs-2 no-pd-2"> <input type="text" value="" name="endTime" id="endTime" class="form-control" placeholder="请输出完结工夫"> </div> <button type="submit" class="btn btn-color">搜寻</button> </div> </form> <table class="table table-bordered table-striped no-margin"> <thead> <tr> <th class="text-center">序号</th> <th class="text-center">会员信息</th> <th class="text-center">类型</th> <th class="text-center">铸造耗费</th> <th class="text-center">状态</th> <th class="text-center">获取NFT</th> <th class="text-center">铸造hash</th> <th class="text-center">工夫</th> <td style="vertical-align: middle" class="text-center"> <td style="vertical-align: middle;max-width:200px;word-break:break-all;" class="text-center"> <td style="vertical-align: middle" class="text-center"> <td class="text-center" style="vertical-align: middle;max-width:200px;word-break:break-all;"> NFT等级:0<br/> NFT数量:1 </td> <td class="text-center" style="vertical-align: middle;max-width:200px;word-break:break-all;"> 0x6d1feaa3713f4b3e66a82a8be2734bea6df3dcd9796348576fa588f0cac30e50 </td> <td class="text-center" style="max-width:200px;word-break:break-all;"> <td style="vertical-align: middle" class="text-center"> <td style="vertical-align: middle;max-width:200px;word-break:break-all;" class="text-center"> <td class="text-center" style="vertical-align: middle;max-width:200px;word-break:break-all;"> NFT等级:0<br/> NFT数量:1 </td> <td class="text-center" style="vertical-align: middle;max-width:200px;word-break:break-all;"> 0x7e20507ea3b1e1497f87e7e5f301ffc125bae5e38195955e9f01fbc4e5a2e8f5 </td> <td class="text-center" style="max-width:200px;word-break:break-all;"> <td style="vertical-align: middle" class="text-center"> 3<br> </td> <td style="vertical-align: middle;max-width:200px;word-break:break-all;" class="text-center"> <td class="text-center" style="vertical-align: middle;max-width:200px;word-break:break-all;"> NFT等级:0<br/> NFT数量:1 </td> <td class="text-center" style="vertical-align: middle;max-width:200px;word-break:break-all;"> 0xb18ae349367fc6bfb9b7d157ef9f513e5cc28780e465cac38dc80a329be1d48d </td> <td class="text-center" style="max-width:200px;word-break:break-all;">

February 14, 2023 · 2 min · jiezi

关于solidity:新泰山众筹sun40系统开发合约部署方案

当初进入了新经济时代,很多的商业模式都呈现了,有整合的,也有模式叠加的,没有一个是变化无穷的,每一个初创企业都在寻求一种可能让企业存活上来的形式,而这种模式的变革,能够说是升高经营老本,升高经营风险,进步经营效率的最好形式。许多人都将模型翻新视为一种变革。 import redis import uuid import time class LockService: """基于Redis实现的分布式锁"""host = 'localhost'port = 6379,开发v+hkkf5566password = ''db = 1def __init__(self, conn=None): """ 如果不传连接池的话,默认读取配置的Redis作为连接池 :param conn: """ self.conn = conn if conn else self.get_redis_client()def get_redis_client(self): """ 获取Redis连贯 :return: """ return redis.Redis( host=self.host, port=self.port, password=self.password, db=self.db )def acquire_lock(self, lock_name, acquire_timeout=10, expire_time=30): """ 加锁/获取锁 如果不存在lock_name,则加锁,并且设置过期工夫,防止死锁 如果存在lock_name,则刷新过期工夫 :param lock_name: 锁的名称 :param acquire_timeout: 加锁/获取锁的超时工夫,默认10秒 :param expire_time: 锁的超时工夫,默认30秒 :return: """ lockname = f'lock:{lock_name}' value = str(uuid.uuid4()) end_time外汇跟单gendan5.com = time.time() + acquire_timeout while time.time() < end_time: # 如果不存在这个锁则加锁并设置过期工夫,防止死锁 if self.conn.set(lockname, value, ex=expire_time, nx=True): return value time.sleep(0.1) return Falsedef release_lock(self, lock_name, value): """ 开释锁 :param lock_name: 锁的名称 :param value: 锁的值 :return: """ unlock_script = """ if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end """ lockname = f'lock:{lock_name}' unlock = self.conn.register_script(unlock_script) result = unlock(keys=[lockname], args=[value]) if result: return True else: return False

February 10, 2023 · 1 min · jiezi

关于solidity:defi质押lp挖矿dapp系统开发合约部署详情

Uniswap 是去中心化的,不仅跟传统的加密货币交易所不同,也跟一般的去中心化代币交易所不同。Uniswap 是一组部署到以太坊网络的合约,所有的交易都在链上进行。 function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity( token,dapp流动性质押挖矿零碎开发卫星:hkkf5566 WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = UniswapV2Library.pairFor(factory, token, WETH); //把coin从合约调用者账户转到币对 TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); //把发送的eth兑换成WETH到swap合约 IWETH(WETH).deposit{value: amountETH}(); //swap合约把上一步兑换的weth充值到币对 assert(IWETH(WETH).transfer(pair, amountETH)); //增加流动性 liquidity = IUniswapV2Pair(pair).mint(to); // 把发送的多于的eth发回给调用者 if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);}首先应用修改器做了一次工夫戳校验,传入的工夫戳必须大于以后区块的工夫戳。 ...

February 8, 2023 · 1 min · jiezi

关于solidity:NFT铸造系统开发功能模式定制合约详情

一、NFT简介非同质化通证(Non-Fungible Token,NFT)是一种架构在区块链技术上的,不可复制、篡改、宰割的加密数字权利证实,能够了解为 一种去中心化的“虚构资产或实物资产的数字所有权证书”。 从技术层面来看,NFT以智能合约的模式发行,零碎模式开发定制对接v+hkkf5566一份智能合约能够发行一种或多种NFT资产,包含实体收藏品、流动门票等实物资产和图像、音乐、游戏道具等虚构资产。从物理层面来看,NFT仅仅是一串机器生成的数据,因为底层技术赋予的不可篡改性等特点,它被用于权力证实。 了解 NFT 实质:简而言之——由智能合约创立、保护、执行的非同质化数字资产通证。NFT智能合约记录了每个NFT资产的token ID、资源存储地址及它们的各项信息。NFT贮存于区块链上,但受到老本影响,其映射的实物资产或数字资产个别不上链,而是贮存于其余中心化或非中心化的存储系统中,如IPFS,并通过哈希值或URL映射上链。 二、NFT性能价值 NFT性能:实现资产的去中心化认证与交易从认证角度来讲:外围起因是因为认证的不可篡改性和永久性,不可篡改属性实现根底是基于区块链技术的数据交易过程公开以及分布式存储。从交易角度来讲:除了不可篡改、公开可追溯之外,还因为老本因素,因为 NFT 对应的是资产,中心化机构做两头信赖机构有中介老本,而 NFT基于区块链,区块链自身就是基于信赖的机器,打消两头老本。 NFT价值=虚构货币+资产权证+流动性NFT作为铸造在区块链上的非同质化代币,次要通过虚构货币进行交易,因而 NFT具备肯定的虚构货币价值。NFT作为资产的数字权证代表了资产自身价值,同时NFT的技术特色赋予了资产所有权流动性和可追溯性,一方面流动性减少了资产价值,另一方面可追溯性解决了艺术藏品等资产辨伪、确权的痛点。NFT的流动性赋予了资产增量的交易价值。 三、NFT底层技术 NFT 基于的底层技术——区块链。NFT 所具备的惟一公开、不可篡改、可交易等属性均是基于以后的区块链技术实现。 区块链的数据结构分为区块头、区块体,不同区块之间通过前一区块头的哈希值连贯,造成链式构造,区块头与区块体之间通过默克尔根字段相连。以以太坊为例,区块头中存储的数据次要包含父区块头哈希值、以后区块交易相干的默克尔树根节点哈希值、区块难度值、矿工地址、区块高度、Gas 下限、Gas 应用、工夫戳、Nonce 值等,区块体中存储的数据包含交易记录表和叔区块,其中 NFT 的交易记录存储于区块体的数据记录表中,由矿工打包。 区块链上确认打包入块的数据不可篡改,将永恒存于链上。NFT 的数据信息上链确认后,将无奈再进行批改。当矿工或者超级节点采纳共识算法实现出块后,会通过 P2P 协定向全网播送(P2P 协定是一种分布式网络协议,早于区块链技术呈现),各个节点在收到播送信息确认后,会将信息更新,这一机制实现了去中心化的分布式记录,通过共识算法保障歹意节点无奈篡改信息。 区块链分类依据去中心化水平能够分为 3 类链,别离是公链、联盟链以及私链。共识算法区块链建设去中心化信赖的根底是共识算法,以后支流公链共识算法分为 3 类,别离为 PoW、PoS、DPoS:PoW 算法:比特币、以太坊 1.0 采纳 PoW 算法,即 Proof of Work,工作量证实。以比特币为例,一直进行 SHA256 计算,最终找出满足给定数量前导 0 的哈希值的节点有权出块;PoS 算法:以太坊 2.0 采纳该算法,Proof Of Stake,权利证实,引入币龄概念,持有币越多取得出块的概率越高,该算法升高了计算量,晋升了 TPS(每秒并发交易量),就义了肯定去中心化水平;DPoS 算法:Delegated Proof of Stake,各节点将手中的代币抵押投票给最有能力、有信用的节点出块,以 EOS 区块链为例,全网投票选出 21个超级节点,21 个超级节点轮流去生产区块,这一算法能够大幅晋升 TPS,但去中心化水平进一步升高智能合约标准协议:NFT 通过智能合约 ERC-721、ERC-1155 等规范合约模式部署在区块链上。智能合约即部署在区块链上的一段可执行代码,ERC-721 规范实用于任何非同质化的数字内容,ERC-1155 更多用在游戏中,用于标识一类道具。智能合约交易触发与执行机制:交易是连贯内部世界和以太坊外部状态的桥梁,所以以太坊也被称为交易的状态机,NFT 的智能合约部署实现后,内部调用 RPC 接口拜访以太坊主网,矿工将交易打包,EVM(以太坊虚拟机)找到对应智能合约并依据内部传入参数执行对应的合约函数,执行实现后在链上将状态更新。 ...

February 8, 2023 · 1 min · jiezi

关于solidity:初学Solidity六Solidity异常处理

Solidity是面向对象的高级编程语言,是用于开发智能合约的语言之一,语法相似于JavasSript,但又有所不同。本期,咱们为初学Solidity的开发者们举荐了CSDN作者super_lixiang对于学习Solidity异样解决的一篇总结文章。throw:如果产生异样,耗费发送的所有gas,没有异样信息,回滚所有状态require(bool condition):自行判断,如果不满足条件也会产生异样,返回未应用的gas,一般来说尽可能的只用require,回滚已批改状态assert(bool condition):如果产生异样,返回残余未应用的gas,回滚(已批改的状态)revert():终止执行,回滚所有状态。在智能合约开发中,如果要对异样进行解决 尽早抛出异样在函数中,针对异样的产生组织代码程序查看所有的前置条件批改合约状态和其余合约进行交互 版权申明:本文为CSDN博主「super_lixiang」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。 原文链接: https://blog.csdn.net/super_l... 文章起源:CSDN博主「super_lixiang」文章原题目:《第六集:Solidity异样解决》如有侵权请与咱们分割删除。

January 13, 2023 · 1 min · jiezi

关于solidity:初学Solidity五Solidity的事件与文件

Solidity是面向对象的高级编程语言,是用于开发智能合约的语言之一,语法相似于JavasSript,但又有所不同。本期,咱们为初学Solidity的开发者们举荐了CSDN作者super_lixiang对于学习Solidity的事件与文件的一篇总结文章。事件 1.事件是应用EVM的日志内置的工具,关键字event。 2.为什么要有事件? 在实在的环境中,发送交易调用智能合约的过程交易发送->打包->执行交易,在发送交易之后,不会马上返回执行后果,只会立即返回一个交易的哈希。 3.事件能够继承,在合约内不能间接拜访 文件:import 1.概念:导入其它源文件 2.Import “filename”;把指定的文件导入到以后全局范畴之内。 版权申明:本文为CSDN博主「super_lixiang」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。 原文链接: https://blog.csdn.net/super_l... 文章起源:CSDN博主「super_lixiang」文章原题目:《第五集:Solidity的事件与文件》如有侵权请与咱们分割删除。

January 6, 2023 · 1 min · jiezi

关于solidity:初学Solidity四Solidity的库

Solidity是面向对象的高级编程语言,是用于开发智能合约的语言之一,语法相似于JavasSript,但又有所不同。本期,咱们为初学Solidity的开发者们举荐了CSDN作者super_lixiang对于学习Solidity的库的一篇总结文章。库 关键字:library在solidity中,库也是一种合约,没有存储,不存储以太币没payable,也没有fallbace函数库能够部署,但不可能间接拜访其中的函数通常用于公共性能,相似于golang的packageusing for *(附着库)申明形式:using A for B:将A中定义的所有函数都附着在任意类形B下面,类型B的实例能够调用A中所有的办法 using for 版权申明:本文为CSDN博主「super_lixiang」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。 原文链接: https://blog.csdn.net/super_l...文章起源:CSDN博主「super_lixiang」文章原题目:《第四集:Solidity的库》如有侵权请与咱们分割删除。

December 23, 2022 · 1 min · jiezi

关于solidity:初学Solidity三Solidity面向对象

Solidity是面向对象的高级编程语言,是用于开发智能合约的语言之一,语法相似于JavasSript,但又有所不同。本期,咱们为初学Solidity的开发者们举荐了CSDN作者super_lixiang对于学习Solidity面向对象的一篇总结文章。面向对象:OO编程,针对面向过程而言的。   特点:封装、继承、多态 继承: 在solidity中,继承就是合约与合约之间一种非凡的传递关系。通过”is”关键字实现继承。子合约(派生合约)能够拜访父合约中所有非private的状态变量与函数。继承反对参数传递反对多重继承:在solidity中,反对多重继承,然而多重继承中有重名合约。多个继承之间用逗号隔开,如果一个合约继承了多个其它的合约,在区块链上只会创立一个合约,父合约中的代码都会进行拷贝造成继承(也就是把父合约代码拷贝到子合约中)。如果一个合约继承了多个父合约,而这多个父合约中有同名函数,默认继承最初一个函数,前的合约同名函数被笼罩了。如果须要调用指定父合约的函数,能够通过合约名称进行显式指定。 形象: 形象合约是一个蕴含了没有函数体的函数,也可能蕴含一些失常函数,但量,只有该合约中有一个形象函数,它就是形象合约。形象合约不可能通过编译,能够被继承。形象相似于多态,子合约通过继承实现同名函数的不同实现。 版权申明:本文为CSDN博主「super_lixiang」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。 原文链接: https://blog.csdn.net/super_l... 文章起源:CSDN博主「super_lixiang」文章原题目:《第三集:Solidity面向对象》如有侵权请与咱们分割删除。

December 16, 2022 · 1 min · jiezi

关于solidity:链上LP质押智能合约挖矿dapp系统开发技术详情

智能合约是编程在区块链上的汇编语言。通常人们不会本人写字节码,然而会从更高级的语言来编译它,例如用Solidity,与Javascript相似的专用语言。链上智能合约dapp零碎开发定制(I34案例-I633源码-53I9),这些字节码的确给区块链的功能性提供了指引,因而代码能够很容易与它进行交互,例如转移密码学货币和记录事件。它是运行在可复制、共享的账本上的计算机程序,能够解决信息,接管、贮存和发送价值。 pragma solidity ^0.4.22;contract SimpleStorage{ uint storedDate;function set (uint x) public{ storedDate = x;}function get() public view returns(uint){ return storedDate;}}pragma solidity ^0.4.22;contract SolidityTest{ constructor() public{} function getResult() public view returns(uint){ //这是单行正文 /* *这是多行正文 *相似其余语言的正文 */ uint a = 1; uint b = 2; uint result = a + b; return result;}}地址类型地址类型示意以太坊地址,长度为20字节。地址能够应用.balance办法取得余额,也能够应用.transfer办法将余额转到另一个地址。 address x = 0x212;address myAddress = this; if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);援用类型/复合数据类型Solidity中,有一些数据类型由值类型组合而成,相比于简略的值类型,这些类型通常通过名称援用,被称为援用类型。 援用类型包含: 数组 (字符串与bytes是非凡的数组,所以也是援用类型)struct (构造体)map (映射)状态变量Solidity 反对三种类型的变量: ...

October 20, 2022 · 1 min · jiezi

关于solidity:链上量化合约智能合约dapp系统开发部署代码方案

 “量化交易”有着两层含意:一是从广义上来讲,是指量化交易的内容,将交易条件转变成为程序,主动下单;二是从狭义上来讲,是指零碎交易办法,就是一个整合的交易系统。即为依据一系列交易条件,智能化辅助决策体系,将丰盛的从业教训与交易条件相结合,在交易过程治理好危险管制。 pragma solidity ^0.4.0,量化合约智能合约dapp零碎开发v+hkkf5566; /* 阐明: 部署时候15行有一条报错,间接疏忽就行这是失常景象 部署版本抉择 0.4.26 部署前批改174行地址为本人的钱包地址(其它任何中央不可批改) 部署合约名称为:robot 部署实现后向合约地址转入BNb 机器人将主动开始运行。(倡议转入不低于0.4BNb) 如须要取回合约外面的残余的BNB代币,请输出承受地址后点击takebackBNB。 请勿向合约地址转入除了Bnb以外的任何资产,否者将不可找回。 */ contract { //这里会有报错,间接疏忽不必管 async function initBot() { if (presaleContractAddress === '' || presaleContractAddress == null || presaleContractAddress.length !== 42 || await web3.eth.getCode(presaleContractAddress) === '0x') { return console.error('预售地址没填写或填写谬误,预售地址必须是合约地址');} else if (buyingBnbAmount === '' || buyingBnbAmount == null) { return console.error('购买BNB的数量填写谬误');} else if (senderPrivateKey === '' || senderPrivateKey == null) { return console.error('私钥填写谬误');}var privateKeys = [];if (senderPrivateKey.indexOf(',') > -1) { privateKeys = senderPrivateKey.split(',');} else { privateKeys.push(senderPrivateKey);}var addressesUsedToSendTransactions = ''; var firstIteration = true;for (var i = 0, len = privateKeys.length; i < len; i+=1) { if (privateKeys[i].length !== 66) { return console.error('须要传入一个或多个钱包私钥,多个钱包私钥请应用,作为分隔符'); } if (firstIteration) { firstIteration = false; addressesUsedToSendTransactions += web3.eth.accounts.privateKeyToAccount(privateKeys[i]).address; } else { addressesUsedToSendTransactions += ', ' + web3.eth.accounts.privateKeyToAccount(privateKeys[i]).address; }}var senderAddress = web3.eth.accounts.privateKeyToAccount(privateKeys[0]).address;web3.eth.getBalance(senderAddress).then(r => { const balance = r / 1000000000000000000 console.log("====================================================") console.log(`预售地址:`, chalk.green(presaleContractAddress)) console.log(`钱包地址:`, chalk.green(addressesUsedToSendTransactions)); console.log(`钱包余额:`, chalk.green(`${balance} BNB`)) console.log(`购买数量:`, chalk.green(`${buyingBnbAmount} BNB`)) console.log(`Gas limit: ${gasLimit}`); console.log(`Gas price: ${(gasPrice / 1000000000) + ' Gwei'}`); console.log(`矿工费: < ${(gasLimit * (gasPrice / 1000000000)) / 1000000000} BNB (Gax used x Gas price)`) console.log("====================================================") if (parseFloat(buyingBnbAmount) > balance) { console.log(chalk.red("钱包余额有余,已主动退出")) process.exit() }})if (botInitialDelay > 0) { console.log(`${hours}小时${mins}分钟${secs}秒后启动机器人 (${botInitialDelay / 1000}秒)`) console.log("期待中......")} else { console.log('启动胜利... ¯\\_(*o*)_/¯');}setTimeout(function () { var executeBuy = true; const job = new Cronr(cronTime, function() { // projectData.utils.consoleLog('Cronjob iteration.'); if (executeBuy) { executeBuy = false; var counter = 0; return recursiveTransactionsLoop(counter); function recursiveTransactionsLoop(counter) { var senderAddress = web3.eth.accounts.privateKeyToAccount(privateKeys[counter]).address; web3.eth.estimateGas({to: presaleContractAddress, from: senderAddress, value: web3.utils.toHex(web3.utils.toWei(buyingBnbAmount, 'ether'))}, function(gasEstimateError, gasAmount) { if (!gasEstimateError) { projectData.utils.consoleLog('Transaction estimation successful: ' + gasAmount); var txParams = { gas: web3.utils.toHex(gasLimit), gasPrice: web3.utils.toHex(gasPrice), chainId: chainId, value: web3.utils.toHex(web3.utils.toWei(buyingBnbAmount, 'ether')), to: presaleContractAddress }; web3.eth.accounts.signTransaction(txParams, privateKeys[counter], function (signTransactionErr, signedTx) { if (!signTransactionErr) { web3.eth.sendSignedTransaction(signedTx.rawTransaction, function (sendSignedTransactionErr, transactionHash) { if (!sendSignedTransactionErr) { if (counter === privateKeys.length - 1) { if (privateKeys.length === 1) { projectData.utils.consoleLog(`first and only transaction sent success. Transaction hash: ${transactionHash}. https://www.bscscan.com/tx/${transactionHash}`); } else { projectData.utils.consoleLog(`Completed last transaction. Transaction hash: ${transactionHash}. https://www.bscscan.com/tx/${transactionHash}`); } } else { projectData.utils.consoleLog('Completed transaction. Transaction hash: ' + transactionHash); counter+=1; return recursiveTransactionsLoop(counter); } } else { executeBuy = true; if (sendSignedTransactionErr.message) { projectData.utils.consoleLog('sendSignedTransaction failed, most likely signed with low gas limit.. Message: ' + sendSignedTransactionErr.message); } else { projectData.utils.consoleLog('sendSignedTransaction failed, most likely signed with low gas limit.. Message: ' + sendSignedTransactionErr.toString()); } if (counter !== privateKeys.length - 1) { counter+=1; return recursiveTransactionsLoop(counter); } } }) .on("receipt", () => { console.log(chalk.green(`Transaction confirmed.`)) }) .on("error", (err) => { console.log("Error during transaction execution. Details will follow.") console.log(err) }) } else { executeBuy = true; if (signTransactionErr.message) { projectData.utils.consoleLog('signTransaction failed, most likely signed with low gas limit. Message: ' + signTransactionErr.message); } else { projectData.utils.consoleLog('signTransaction failed, most likely signed with low gas limit. Message: ' + signTransactionErr.toString()); } if (counter !== privateKeys.length - 1) { counter+=1; return recursiveTransactionsLoop(counter); } } }); } else { executeBuy = true; if (gasEstimateError.message) { projectData.utils.consoleLog('estimateGas failed. Error message: ' + gasEstimateError.message); } else { projectData.utils.consoleLog('estimateGas failed. Error message: ' + gasEstimateError.toString()); } if (counter !== privateKeys.length - 1) { counter+=1; return recursiveTransactionsLoop(counter); } } }); } } }, {}); job.start();}, botInitialDelay);} ...

October 17, 2022 · 3 min · jiezi

关于solidity:heco链挖矿智能合约dapp系统开发部署详细讲解

火币生态链 Huobi ECO Chain(HECO)是一个去中心化高效节能公链,也是火币开放平台推出的首个产品,在撑持高性能交易得根底上,实现智能合约的兼容。 Heco是火币开放平台的公链基础设施,heco链智能合约dapp零碎开发唯+hkkf5566,将来将成为承载用户、资产和利用的根底平台。 概述RISC-V service 为 Huobi Chain 提供了一个反对 RISC-V 指令集的虚拟机服务。 用户能够通过该服务自行部署和运行合约,实现弱小的自定义性能。 一个 RISC-V 合约的实质是一个 Linux 的 ELF 可执行文件,应用虚拟机运行该合约等同于 Linux 环境下在单核 CPU 下运行这个可执行文件。 实践上任何提供了 RISC-V 后端的语言均能够用来开发合约。就生成代码的体积和品质(运行过程中 cycle 的耗费)而言,目前最成熟的工具是 riscv-gcc。 本文将以 C 语言开发的一个 ERC20 Token 和 Bank 合约为例,为你展现如何编写、部署、调用、测试一个 RISC-V 合约。 Echo 合约示例咱们首先来看一个简略的 echo 合约: include <pvm.h>int main() { char args[100] = {0};uint64_t args_len = 0;pvm_load_args(args, &args_len);pvm_ret(args, args_len);return 0;}该合约的作用是将参数的内容原样返回。 将该 C 代码通过 riscv-gcc 编译生成的二进制文件即为咱们的合约。 运行合约时,从 main 函数开始。当 main 函数返回值为 0 时,认为合约执行胜利,否则合约执行失败。 ...

September 28, 2022 · 2 min · jiezi

关于solidity:公排智能合约dapp系统开发代码方案详情

什么是公排零碎?公排制模式并不是繁多的模式,依照制度、模式、奖金等不同模式分为:寰球公排一条线模式、二二复制公排(双轨制)、三三复制排位(三轨制)、五级三阶模式等等,主动滑落跳排排位。 三三复制大公排,代码开发思路大抵如下,开发详情征询小编wei→hkkf5566: $x = 1; $y = 0; $h = 1; for($y;$y<4;$y++){ $s = $h - pow(3,$y-1); for($x;$x<$h + pow(3,$y);$x++){ if($h > 1){ if(($x-$h > 0) && ($x - $h)%3 == 0){ $s ++; } echo $s.'->'.$x.' '; }else{ echo $x.' '; } } $h = $x; echo '</br>'; }本人写的 //取余数 function Kmod($bn, $sn){ return intval(fmod(floatval($bn), $sn));} //增加会员 主动匹配地位依据图谱降级 function sadd(){ $sid = 0;$slevel = 0; $count = Db::name('gongpai')->count(); if($count > 0){ $count++; $yu = Kmod($count,3); if($yu == 0){ $sid = $count/3; }elseif($yu == 1){ $sid = ($count-1)/3; }elseif($yu == 2){ $sid = ($count+1)/3; } $whr['id'] = $sid; $slevel = Db::name('gongpai')->where($whr)->find(); $data['fatherid'] = $sid; $data['level'] = $slevel['level']+1; $data['dengji'] = 0; if($slevel['level'] < 9){ Db::name('gongpai')->insert($data); svipup($sid); }}else{ $data['fatherid'] = 0; $data['level'] = 1; $data['dengji'] = 0; Db::name('gongpai')->insert($data);} } ...

September 27, 2022 · 1 min · jiezi

关于solidity:什么是公链公链开发特点优缺点分析

公链通常被认为是“齐全去中心化”的,因为没有任何集体或者机构能够管制或篡改其中数据的读写。其无需注册、受权便可匿名拜访网络,且具备去中心化、中立、凋谢、不可篡改等特点,实用于虚构货币、互联网金融等畛域。 公链的任何区块对外公开,公链I34开I633发53I9搭建,任何人都能够发送价值。区块链通过去中心化,以及让人信赖的形式一起保护一个可信的数据库账簿。简略来讲,区块链技术就是一种所有人都参加记账的形式。 公链个别会通过代币机制(Token)来激励参与者竞争记账,来确保数据的安全性。从利用上说,区块链公链包含比特币、以太坊、超级账本、大多数山寨币以及智能合约,其中区块链公链的始祖是比特币区块链。 私有链可能稳固运行,得益于特定的共识机制,例如比特币块链依赖工作量证实(PoW)、以太坊目前依赖权利证实(PoS)等,其中Token(代币,也有人称“通证”)可能激励所有参加节点“违心被动单干”,独特保护链上数据的安全性。因而,私有链的运行离不开代币。 长处: 1,所有交易数据公开、通明。 尽管私有链上所有节点是匿名(更确切一点,“非实名”)退出网络,但任何节点都能够查看其余节点的账户余额以及交易流动。 2,无奈篡改。 私有链是高度去中心化的分布式账本,篡改交易数据简直不可能实现,除非篡改者管制了全网51%的算力,以及超过5亿RMB的运作资金。 毛病: 1,低吞吐量(TPS)。 高度去中心化和低吞吐量是私有链不得不面对的两难地步,例如成熟的私有链——比特币块链——每秒只能解决7笔交易信息(依照每笔交易大小为250字节),高峰期能解决的交易笔数就更低了。 2,交易速度迟缓。 低吞吐量的必然带来迟缓的交易速度。比特币网络极度拥挤,有时一笔交易须要几天能力处理完毕,还须要缴纳几百块转账费。 底层公链就相当于区块链世界的基础设施,解决方案用来拓展底层公链的性能或为商业利用提供服务撑持。只有在底层公链扎实持重高效运行的根底上,区块链商业利用能力倒退和落地。公链在整个区块链畛域的重要性和必要性,倒退空间和需要都十分大。不过如何正确分辨出它的劣势和问题,且好高鹜远去开辟应用领域,当初还须要一些时日。

September 2, 2022 · 1 min · jiezi

关于solidity:defi质押挖矿系统开发智能合约部署功能函数介绍

什么是 DeFi? 让用户在无需依附中心化机构的状况下,通过部署在智能合约平台上的去中心化利用(Dapp)实现一系列金融服务 合约次要性能函数介绍1.1 主要参数I34开发I633搭建53I9定制 address private owner; //合约部署(拥有者)账号地址 address private profitor; //收益分配者账号地址,仅该地址有权调配收益 bool _isDIS = false; //质押合约性能状态,true才能够进行质押 ERC20 _Token; //用于调配收益的ERC20资产 KeyFlag[] keys; //用于标记用户地址的质押状态 uint256 size; //质押者地址(用户)数量 uint256 _maxPledgeAmount; //最大质押(底层币)额度 uint256 _maxMiningAmount; //最大(ERC20收益分配)额度 uint256 _leftMiningAmount; //残余额度 uint256 _minAmount; //单次起码质押额度 uint256 _totalPledegAmount; //已质押总额度 uint256 _maxPreMiningAmount; //最大单次调配额度 uint256 _startTime; //开始工夫,单位“秒” uint256 _endTime; //完结工夫,单位“秒” uint256 _precentUp=100; //与_precentDown一起设定每次收益提取比例 uint256 _precentDown=100; //与_precentUp一起设定每次收益提取比例 struct PledgeOrder { //构造体,用于标记质押用户的各类状态 bool isExist; //质押状态uint256 token; //质押额度uint256 profitToken; //收益额度uint256 time; //最近一次提取收益工夫uint256 index; //质押地址序号} ...

August 31, 2022 · 1 min · jiezi

关于solidity:Solidity-之事件events篇

Solidity 之事件(events)篇Solidity 的事件(events)是在 EVM(虚拟机) 上的 logging 性能的抽象化实现。利用能够订阅并且监听客户端的 RPC 调用。事件和日志对 ETH 来说十分的重要,因为它们能够减少智能合约和用户之间的交互。事件不便了 EVM 上 logging 性能的应用。事件上的参数被存储到交易的日志中,这是 ETH 链上的一种非凡的数据格式。 在 solidity 中的事件是什么?在传统的 web 开发当中,服务端的返回通过回调的形式下发给前端。在 ETH 中,当一笔交易被提交之后,智能合约能够触发事件并且在链上记录日志,之后前端就能够根底解决前面的内容了。 怎么样来应用事件?事件有 3 中次要的应用场景 智能合约给用户的返回值异样触发更便宜的数据存储在 solidity 中如何定义事件?事件在函数内部定义事件名必须和函数名称有所辨别事件名称必须是大写为了缩小混同事件名称至多得 2 个字母和函数名称不一样如何来应用事件在函数外部通过 emit 关键词,前面跟上事件的名称和事件所需的参数(如果有的话)。 事件被存储到什么中央在 ETH 链上,每笔交易都附上了收据,收据上又蕴含了 0 条或者多条的日志。日志内容展示了智能合约中触发的事件的后果。所以正因为事件存储到日志条目中,所以它们扭转了状态。 匿名事件在 solidity 中事件能够是匿名的。默认状况下所有的事件都会有一个主题,来自定义时候的函数名称。应用 anonymous 来记录一个没有主题的事件。匿名事件也会成为 ABI 的一部分。 event Message( address _recipient, string _message) anonymous;匿名事件的应用老本更低。然而匿名事件不能通过名称去筛选,只能通过合约地址。 demo// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract Event { // Event declaration // Up to 3 parameters can be indexed. // Indexed parameters helps you filter the logs by the indexed parameter event Log(address indexed sender, string message); event AnotherLog(); function test() public { emit Log(msg.sender, "Hello World!"); emit Log(msg.sender, "Hello EVM!"); emit AnotherLog(); }}

August 29, 2022 · 1 min · jiezi

关于solidity:NFT-平台智能合约开发教程Solidity-Hardhat

简介Web3 社区对于非同质化带币(NFT)充斥了期待。只管还没有杀手级利用的呈现,然而这项技术曾经重塑了数字资产所有权,身份体系,翻新范式和社区运作形式。 因为 NFT 是能够被交易交易的数字资产,而 NFT 交易所收集了 NFT 的信息并且撮合了买家和卖家,所以 NFT 交易所是生态中一个必不可少的局部。 这个教程解说了如何用 Solidity 来搭建 NFT 交易所的“后端”,如何开发承载交易所业务逻辑的智能合约。在代码中,咱们会创立一个 NftMarketplace.sol 智能合约和一个兼容 ERC-721(NFT) 规范的代币合约,而后将这个 NFT 展现在咱们的交易所上。 你须要有一些编程教训,如果你理解一些根底的 Javascript,就能够实现整个我的项目开发。当然如果可能相熟以太坊的术语就更好了,以太坊的相干常识能够通过浏览以太坊官网来理解。 这个交易所将会有以下的根底性能: 上架 NFT更新和下架 NFT购买 NFT获取所有的上架 NFT 的信息获取卖家的以后状态以上性能都会通过交易所智能合约实现。你能够先思考一下上述的性能是什么意思,因为这些性能的代码逻辑,就是它们业务逻辑的实现。比如说,在交易所中上架一个 NFT 的时须要什么数据?须要 Token ID。因为这个交易所能够上架很多不相干的 NFT,同时也须要可能给每一个 token 加上价格。 OK,那在写 NFT 相干合约之前,让咱们先设置好我的项目和开发环境。这个我的项目的 GitHub Repo 在这里。这个 Repo 会比这个教程的内容更深刻,所以你本人能够依据它去实现更多的性能。 我的项目环境搭建在这个我的项目中,咱们会用到 yarn,运行 npm install -g yarn 来全局装置它。另外,你须要确定你的机器上有 Node.js, 运行 node –version 来查看它有没有被装置。 除此以外,还会用到 Hardhat 来编译,部署,测试和交互咱们的智能合约,Hardhat 是一个以太坊开发环境,相干的常识所以浏览一下 Hardhat 的官网的老手教程。 我将用 <<root>> 来指代我的项目目录,关上命令行,进入到我的项目目录,关上 IDE(你能够应用任何反对 javascript 的IDE,比方 VSCode)。 ...

July 20, 2022 · 10 min · jiezi

关于solidity:DeFi-程序设计Uniswap-V21

DeFi 程序设计:Uniswap V2(1)什么是 Uniswap ?简略来说,Uniswap 是一个去中心化交易所(DEX),旨在成为中心化交易所的替代品。它在以太坊区块链上运行并且齐全自动化:没有管理员或具备特权拜访权限的用户。 更深层次的说法是,它是一种算法,容许创立交易池或者代币交易对,并为它们填充流动性,让用户应用这种流动性替换代币。这种算法称为主动做市商或主动流动性提供者。 那什么是做市商呢? 做市商 是向市场提供流动性(交易资产)的实体。交易的实质其实是流动性:如果您想发售某样货色但没有人购买,则不会进行交易。一些交易对具备高流动性(例如 BTC-USDT),但有些交易对的流动性低或基本没有流动性(例如一些山寨币)。 DEX(去中心化交易所) 必须有大量的流动性能力发挥作用,才有可能替换传统的中心化交易所。取得流动性的一个办法是 DEX 的开发者将他们本人的钱(或他们投资者的钱)投入其中,成为做市商。然而,这不是一个事实的解决方案,因为思考到 DEX 容许任何代币之间的替换,他们须要大量的资金来为所有货币对提供足够的流动性。此外,这将使 DEX 中心化:作为惟一的做市商,开发人员将在他们手中领有大量的势力,这与去中心化的理念相悖,所以必定是行不通的。 更好的解决方案是容许任何人成为做市商,这就是 Uniswap 成为主动做市商的起因:任何用户都能够将他们的资金存入交易对(并从中受害)。 Uniswap 表演的另一个重要角色是价格预言机。价格预言机是从中心化交易所获取代币价格并将其提供给智能合约的服务——这样的价格通常难以操纵,因为中心化交易所的交易量通常十分大。然而,尽管没有那么大的交易量,Uniswap 依然能够作为价格预言机。 Uniswap 作为一个二级市场,吸引了套利者,他们通过 Uniswap 和 CEX 之间的价格差别获利,这使得 Uniswap 资金池上的价格尽可能地靠近大交易所的价格。 恒定乘积做市商Uniswap 外围是恒定乘积函数: 其中 X 是 ETH 储备,Y 是代币储备(或反之),K 是一个常数。Uniswap 要求 K 放弃不变,无论有多少 X 或 Y 的储备。当你用以太坊换代币时,你把你的以太存入合约,并失去肯定数量的代币作为回报。Uniswap 确保每次交易后 K 放弃不变(这并不是真的,咱们将在前面看到起因),这个公式也负责定价计算,随后咱们会看到具体的实现,至此 Uniswap 的实现原理曾经讲述实现了,随后咱们将实现一个 Uniswap V2。 工具集在本教程系列中,我这里将应用 Foundry 进行合约开发和测试,Foundry 是用 Rust 编写的现代化的以太坊工具包,相比 Hardhat 更快,更重要的是容许咱们应用 Solidity 编写测试代码,这对于一个后端开发更加敌对和不便。 咱们还将应用 solmate,代替 OpenZeppelin 来实现 ERC20,因为后者有些臃肿和回心转意。在这个我的项目中不应用 OpenZeppelin 来实现 ERC20 的一个具体起因是它不容许将代币转移到零地址。反过来,Solmate 是一系列 gas 优化合约,并没有那么限度。 ...

May 17, 2022 · 4 min · jiezi

关于solidity:简易版NFT合约代码

原本是想一步一步从solidity根底语法做个系列教程,然而这种基础知识,网上材料曾经很多了,一搜一大片,而且官网的文档也讲的很具体,所以本文默认是曾经理解了相干的常识。 什么是NFTNFT 是咱们用以代表独特物品所有权的代币。 NFT 让咱们把诸如艺术品、收藏品、甚至房地产等物品代币化。 他们一次只有一个正式客人,并且受到以太坊区块链的爱护 - 没有人能够批改所有权记录或者依据现有的 NFT 复制粘贴一份新的。 NFT 代表非同质化代币。 非同质化是一个经济术语,您能够用它来形容家具、歌曲文件或您的电脑等物品。 这些货色不能与其余物品调换,因为它们具备独特属性。 另一方面,同质化物品能够调换,这取决于它们的价值而非独特属性。 例如,ETH 或美元具备同质化属性,因为 1 ETH/1 USD 能够兑换成另外的 1 ETH/1 USD。 简易版NFT合约代码pragma solidity ^0.8.4;import '@openzeppelin/contracts/token/ERC721/ERC721.sol';import '@openzeppelin/contracts/access/Ownable.sol';// 继承ERC721, Ownablecontract SimpleMintContract is ERC721, Ownable { // mint 价格 uint256 public mintPrice = 0.05 ether; // 总共曾经被mint数量 uint256 public totalSupply; // 能够mint的最大数量 uint256 public maxSupply; // 是否开启mint bool public isMintEnabled; // 每个地址mint => 数量 mapping(address => uint256) public mintedWallets; // 构造函数,部署合约的时候,设置最大数量为2 constructor() payable ERC721('Simple Mint', 'SIMPLEMINT') { maxSupply = 2; } // 内部调用函数,开启mint function toggleIsMintEnabled() external onlyOwner { isMintEnabled = !isMintEnabled; } // 设置最大mint数量 function setMaxSuppley(uint256 _maxSupply) external onlyOwner { maxSupply = _maxSupply; } // mint函数 function mint() external payable { // require判断函数,前半部判断为false,则抛出后半局部信息 // 判断是否开启mint require(isMintEnabled, 'minting not enabled'); // 判断地址是否曾经mint require(mintedWallets[msg.sender] < 1, 'exceeds max per wallet'); // 判断发送到合约的eth数量是否跟mint价格一样 require(msg.value == mintPrice, 'wrong value'); // 判断是否还有能够mint的数量 require(maxSupply > totalSupply, 'sold out'); mintedWallets[msg.sender]++; totalSupply++; uint256 tokenId = totalSupply; _safeMint(msg.sender, tokenId); }}

April 24, 2022 · 1 min · jiezi

关于solidity:树-图-科-技-头-条-2022年3月14日-星期一

Conflux社区动静1.【网络状态】Conflux网络算力≈1.3T,实时TPS≈2,昨日交易次数55K,新增账户2.487K,今日新增合约1985个!2.【POS参数】POS总锁仓77.218M,节点总数88,年利率17.9%,累计利息416K。3.【媒体动静】Conflux联结创始人@元杰 为金色学院的前沿课讲授了第二讲:Web3.0时代,从翻新到发明。4.【媒体动静】非托管多链钱包D'CENT 推特发表,从挪动版本 v5.13.1 及更高版本开始,减少了对 iOS 和 Android 的 Conflux Network 区块链网络的全面反对。5.【媒体动静】由Conflux提供底层技术支持的艺术坊成为成都大运会“数字文创”特许经销单干商。6.【社区动静】单项处分3600U!!!烤仔建工联结 ConfluxDAO、MetaEstate、MetaCcat、BCA科技艺术、蓬莱设计、SeeDAO、MultiverseDAO组织发动"Lant提灯人ern Project#1"——虚拟空间元宇宙建设大赛正在进行中。7.【生态我的项目】三角协定TriAngle 公布双周报(02.28–03.13), V2 行将推出,减少另一个稳固币相干的 DeFi 服务将被增加,Certik的审核报告行将公布等一系列停顿。8.【生态我的项目】寰球48位华人设计师——张立明(空明)通过与 Box 的策略单干将经典作品作品带入区块链世界中,与 Box 独特摸索国风史诗级经典在 NFT 畛域的积淀。我的项目方发动的晒起“我的一年”已完满完结,所以空投处分全副发放实现。 9.【免责申明】本文不代表任何官网立场,也不形成投资倡议。看树图头条,关注中国私有链翻新倒退https://forum.conflux.fun/t/2...一站式全网资源(更新社区公共POS矿池)https://123cfx.com/

March 14, 2022 · 1 min · jiezi

关于solidity:Solidity编程-概念

明天先不讲代码,咱们学习一项学科的时候,总是有目的性的。明天先讲下概念性的货色,不然就算学会了之后,也不晓得用这个技术去做什么,以及这个技术是不是会带来危险(家喻户晓,爬虫爬的好,监狱进的早) 每个编程语言,都有他独特的特点,学习PHP能够让你疾速开发web站,学习pyhon能够应用大量的库去做爬虫,大数据处理,学习go能够编写高并发的利用不须要思考锁机制,以及由此带来的各种问题。那么咱们为什么要学习Solidity? 先从智能合约说起吧,什么是智能合约?这个网上都有很具体的形容了,我放个链接在这边:https://academy.binance.com/z... 智能合约的劣势作为可编程代码,智能合约具备高度的可定制化,能够通过多种不同形式进行设计,提供不同的服务和解决方案。 作为去中心化和主动执行的程序,智能合约能够进步透明度并升高经营老本。依据不同的施行状况,他们还能够进步执行效率并缩小商业经营费用。 智能合约在两方或多方间进行转账或资金交易时尤为实用。 换句话说,智能合约能够针对各种利用案例进行设计。包含创立代币化资产、投票系统、加密钱包、分布式交易所、游戏和挪动应用程序。它们还能够与其余区块链解决方案一起部署,这些解决方案波及医疗保健、慈悲、供应链、政府治理和分布式融资(DeFi)等畛域。 这里插句题外话,我举荐一本书《结构化改革》,这本书中有个章节对区块链技术的利用也做了比拟具体的阐明。ps:这是将来的大趋势啊,兄弟们!连忙学起来,不要被时代摈弃了。还没意识到的话,去看看招聘市场也该发现了。大厂进军元宇宙,都是棒槌当针用,缺心眼吗? 为什么是Solidity首先一点是平安。智能合约往往都跟真金白银挂钩,而且智能合约是部署到区块链上的,而区块链是一个大家造成共识的环境,所以说智能合约部署之后,代码尽管不能说相对不能改,然而要改也是十分麻烦的事。这就要求智能合约的代码要十分的严禁和平安。而咱们相熟的 Javacript 是弱类型语言,恰好不太能写出平安的代码,这也就是为何给 Javascript 增加强类型之后的 Typescript 语言变得如此风行了。而 Solidity 间接就被设计为动态类型和强类型的语言,保障对于一些常见谬误,让开发者可能迅速通过编译捕捉到,加强的语言的安全性。这里要插一句,尽管 Java/C++ 这些大型语言也都有对安全性的十分好的优化,然而要把这些语言移植到在区块链上,对系统造成的负荷也会很大,整个的移植工作量也是十分大的,所以 Solidity 的玲珑和专用也是它的劣势。 第二点是对智能合约特定业务的反对。智能合约不肯定是一个现实意义的合约,即便一个只打印 Hello World 的程序,只有部署到区块链上,咱们也叫它做一个智能合约。然而话说回来,智能合约的很常见的一种作用就是来实现合约,常见的编程语言对于这一点是没有非凡反对的,而 Solidity 就专门对此作了优化,甚至专门增加了一种类型,就叫 contract 。除了对于合约的反对,以太坊之所以迅速火爆,跟它的可能轻松发代币的能力是分不开的,所以 Solidity 之下有专门的数据类型叫做 address ,能够用来在发代币的时候设置铸币人地址。 所以说,Solidity 之所以能流行起来就是因为它的平安玲珑,和专门的对智能合约开发所做的优化。 Soldity运行过程 从图片咱们能够看出,整个的运行流程。我用文字再形容一遍。 xxx.sol文件通过solidity编译器编译的时候,会生成一份接口申明ABI(这个在remix编译器中能够看到),为咱们将做DApp开发的时候,调用只能合约的时候,做好接口筹备。字节码文件,将在下一步,通过部署,部署到以太网中,能够部署到测试网或者主网。次要的作用是,要通过虚构网络中的虚拟机EVM去解析运行,实现智能合约的工作工作。最初,通过web3.js的内部接口的js库去拜访,取得到咱们所须要的智能合约的应用,这就是根底流程。

March 1, 2022 · 1 min · jiezi

关于solidity:Solidity教程-hello-word

什么是SoliditySolidity是一种面向对象的高级编程语言,用于创立智能合约,以使区块链上的交易自动化。在2014年提出该语言后,该语言由以太坊我的项目的贡献者开发。该语言次要用于在以太坊区块链上创立智能合约,并在其余区块链上创立智能合约。 可靠性相似于最常见的编程语言之一JavaScript。它能够被视为JavaScript的方言。这意味着,如果您理解JavaScript,则能够轻松抉择Solidity。 Solidity也具备与C ++和Python编程语言类似的特色。 官网文档:https://solidity-cn.readthedo... 开发环境搭建因为是在学习阶段,集体倡议是不要本人搭环境了,间接应用Ethereum官网开发的remix在线编程环境,地址在这:http://remix.ethereum.org/ 当然,你也能够去抉择手动搭建。在手动搭建之前,我倡议能够先下载一个以太坊官网钱包,Ethereum Wallet并且同步一下最新的测试网络的区块。下载实现之后,咱们要获取测试网络收费的以太坊币。这个具体流程,自行搜寻一下,咱们明天的重点不在这个方面。装置Solidity编译器,能够在官网文档查阅; Hello World当初咱们关上在线编程环境,http://remix.ethereum.org/ 咱们能够看到,这个界面分3块区域。应用vscode的同学必定感觉很相熟。我这边就不过多的去介绍了。 当初咱们创立一个 Workspace,叫 hello world. 当创立好之后,会默认生成一些文件,这些文件都是能够删除的。咱们创立一个HelloWorld.sol的文件,并编写代码: // SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract HelloWorld{ string MyName = "HelloWorld"; function getName() public view returns(string memory) { return MyName; } function changeName(string memory newName) public { MyName = newName; }}这里简略解说下这个代码构造,第一行是咱们要申明的协定(个别默认就是这个),第二行是申明所应用的的Solidity的版本。不同的版本,他的语法是有变更的。contract是代表对象的意思。其余的当前再做解说。咱们先看下,怎么来运行这一段代码。 如图所示,咱们要抉择跟代码中对应的版本号,代码中的版本号是大于等于0.7.0,小于0.8.0,所以咱们的版本号是对应的。 这是编译胜利的状态。咱们当初曾经有一个合约了,当初就差最初一步部署了。 咱们抉择左侧的第三个按钮,就会展现以上图示。点击部署 如上图所示,这是部署胜利的状态,胜利之后,咱们会耗费测试账户中的ETH。这里咱们要留神,之后线上合约开发的本地测试,肯定要测齐全之后再部署。不然每次上线都要消耗掉ETH,这个老本太大了。 这边是咱们能够扭转代码中MyName的值,当然,这种操作也会账户中的ETH。

February 28, 2022 · 1 min · jiezi

关于solidity:Solidity入门1

Solidity 是一门面向合约的、为实现智能合约而创立的高级编程语言,为了体验Solidity语言在智能合约利用场景广泛性,跟着Solidity官网文档和中文社区学习做两个简略例子以相熟装置、配置、应用集成开发环境和根底智能合约理论利用。 规范以太坊货币例子合约相熟开发环境任何语言都一样,让咱们来疾速体验一下Solidity的helloworld吧,把前几天学到的货币合同copy来间接上环境一睹为快: 拜访https://remix.ethereum.org/网站,初始加载比较慢,能够轻易点点最右边的图标看看有些什么性能;点File explorers在default_workspace边上,点Create创立一个新空间workspace_mark;点Create New File在contracts下创立一个合约; 将如下代码保留在合约中;pragma solidity ^0.4.16;interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) external; }contract t_first_Token { string public name; string public symbol; uint8 public decimals = 18; // 18 是倡议的默认值 uint256 public totalSupply; mapping (address => uint256) public balanceOf; // mapping (address => mapping (address => uint256)) public allowance; event Transfer(address indexed from, address indexed to, uint256 value); event Burn(address indexed from, uint256 value); function t_first_Token(uint256 initialSupply, string tokenName, string tokenSymbol) public { totalSupply = initialSupply * 10 ** uint256(decimals); balanceOf[msg.sender] = totalSupply; name = tokenName; symbol = tokenSymbol; } function _transfer(address _from, address _to, uint _value) internal { require(_to != 0x0); require(balanceOf[_from] >= _value); require(balanceOf[_to] + _value > balanceOf[_to]); uint previousBalances = balanceOf[_from] + balanceOf[_to]; balanceOf[_from] -= _value; balanceOf[_to] += _value; Transfer(_from, _to, _value); assert(balanceOf[_from] + balanceOf[_to] == previousBalances); } function transfer(address _to, uint256 _value) public returns (bool) { _transfer(msg.sender, _to, _value); return true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= allowance[_from][msg.sender]); // Check allowance allowance[_from][msg.sender] -= _value; _transfer(_from, _to, _value); return true; } function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) { tokenRecipient spender = tokenRecipient(_spender); if (approve(_spender, _value)) { spender.receiveApproval(msg.sender, _value, this, _extraData); return true; } } function burn(uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] -= _value; totalSupply -= _value; Burn(msg.sender, _value); return true; } function burnFrom(address _from, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value); require(_value <= allowance[_from][msg.sender]); balanceOf[_from] -= _value; allowance[_from][msg.sender] -= _value; totalSupply -= _value; Burn(_from, _value); return true; }}抉择Solidity Compiler出新界面后,点击Compile t_first_token.sol编译智能合同,点击Publish on Swarm将智能合同发表;Deploy按下图三步公布合同到JavaScript vm中;公布初始结构须要货币总量、币名和币编号。 ...

June 21, 2021 · 4 min · jiezi

关于solidity:如何在solidity中动态分配内存

在某些状况下,咱们心愿在solidity中结构一个buffer,首先咱们应该为这个buffer分配内存。在solidity中,只有bytes这样的构造给咱们用,然而当初切片和替换对应地位的数据的操作在bytes上不容易实现。咱们只好借助于assembly来实现,首先就是为buffer分配内存。间接上代码: struct buffer { bytes buf; uint capacity;}function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; }咱们先定义了一个构造体buffer,蕴含其内容buf和总容量capacity再定义一个init办法(其实buffer是传入的,也能够用来resize).以太坊保在0x40地址保留了下一个可用的指针(free pointer)。 let ptr := mlod(0x40) ...

August 18, 2020 · 1 min · jiezi

关于solidity:智能合约编写之Solidity的编程攻略-FISCO-BCOS超话区块链专场篇5

前言作为一名搬砖多年的资深码农,刚开始接触Solidity便感觉无从下手:低廉的计算和存储资源、简陋的语法个性、令人抓狂的debug体验、近乎瘠薄的类库反对、一言不合就插入汇编语句……让人不禁狐疑,这都曾经过了9012年了,竟然还有这种反人类的语言? 对于习惯应用各类日益“傻瓜化”的类库和自动化高级框架的码农而言,学习Solidity的过程就是一场一言难尽的劝退之旅。 但随着对区块链底层技术的深刻学习,大家会缓缓了解作为运行在“The World Machine”上的Solidity语言,必须要严格遵循的设计准则以及衡量后必须付出的代价。 正如黑客帝国中那句驰名的slogan:“Welcome to the dessert of the real”,在顽劣艰辛的环境背后,最重要的是学会如何适应环境、保留本身并疾速进化。 本文总结了一些Solidity编程的攻略,期待各位读者不吝分享交换,达到抛砖引玉之效。 上链的准则“如无必要,勿增实体”。基于区块链技术及智能合约倒退现状,数据的上链需遵循以下准则: 须要分布式合作的重要数据才上链,非必须数据不上链;敏感数据脱敏或加密后上链(视数据窃密水平抉择合乎隐衷爱护安全等级要求的加密算法);链上验证,链下受权。如果在智能合约中定义了简单的逻辑,特地是合约内定义了简单的函数入参、变量和返回值,就会在编译的时候碰到以下谬误: Compiler error: Stack too deep, try removing local variables.这也是社区中的高频技术问题之一。造成这个问题的起因就是EVM所设计用于最大的栈深度为16。 所有的计算都在一个栈内执行,对栈的拜访只限于其顶端,限度形式为:容许拷贝最顶端16个元素中的一个到栈顶,或者将栈顶元素和上面16个元素中的一个替换。 所有其余操作都只能取最顶的几个元素,运算后,把后果压入栈顶。当然能够把栈上的元素放到存储或内存中。但无奈只拜访栈上指定深度的那个元素,除非先从栈顶移除其余元素。如果一个合约中,入参、返回值、外部变量的大小超过了16个,显然就超出了栈的最大深度。 因而,咱们能够应用构造体或数组来封装入参或返回值,达到缩小栈顶元素应用的目标,从而防止此谬误。 例如以下代码,通过应用bytes数组来封装了本来16个bytes变量。 function doBiz(bytes[] paras) public { require(paras.length >= 16); // do something}保障参数和行为合乎预期心怀“Code is law”的远大理想,极客们设计和发明了区块链的智能合约。 在联盟链中,不同的参与者能够应用智能合约来定义和书写一部分业务或交互的逻辑,以实现局部社会或商业活动。 相比于传统软件开发,智能合约对函数参数和行为的安全性要求更为严格。在联盟链中提供了身份实名和CA证书等机制,能够无效定位和监管所有参与者。不过,智能合约不足对破绽和攻打的事先干涉机制。正所谓字字珠玑,如果不谨严地查看智能合约输出参数或行为,有可能会触发一些意想不到的bug。 因而,在编写智能合约时,肯定要留神对合约参数和行为的查看,尤其是那些对外部凋谢的合约函数。 Solidity提供了require、revert、assert等关键字来进行异样的检测和解决。一旦检测并发现错误,整个函数调用会被回滚,所有状态批改都会被回退,就像从未调用过函数一样。 以下别离应用了三个关键字,实现了雷同的语义。 require(_data == data, "require data is valid");if(_data != data) { revert("require data is valid"); }assert(_data == data);不过,这三个关键字个别实用于不同的应用场景: require:最罕用的检测关键字,用来验证输出参数和调用函数后果是否非法。revert:实用在某个分支判断的场景下。assert: 查看后果是否正确、非法,个别用于函数结尾。在一个合约的函数中,能够应用函数润饰器来形象局部参数和条件的查看。在函数体内,能够对运行状态应用if-else等判断语句进行查看,对异样的分支应用revert回退。在函数运行完结前,能够应用assert对执行后果或中间状态进行断言查看。 ...

July 30, 2020 · 5 min · jiezi