关于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

用三张照片讲述Second-State-与DevCon5-的故事

解决现下以太坊智能合约开发挑战 第一张照片来自Devcon 第一天,我们的发言现场。观众熙熙攘攘,只有站立空间。我们进行了非常技术性的介绍,通过BUIDL IDE进行了所有的现场演示,并取得了巨大的成功。 我们演讲的重点是解决现下以太坊智能合约开发的挑战。我们讨论了针对当今EVM 开发的解决方案以及针对以太坊2.0的未来解决方案。您可以点击此处了解挑战和我们的解决方案。 Second State 在EVM 领域是关键创新者 第二张照片来自ETC Labs的Terry Culver的 Devcon主旨演讲,我们出现在主会场演讲的PPT上。 Second State是EVM的主要创新者。我们与在以太经典,CyberMiles和现在的以太坊的合作伙伴正在共同构建基于LLVM 的下一代EVM 语言工具链和基于WebAssembly WASM的执行引擎。 与以太坊团队共同建立下一代编译器工具链 第三张照片显示了Second State 编译器团队向以太坊基金会Solidity 团队展示了我们的解决方案。 Second StateSOLL是世界上第一个成功将Solidity ERC20 合约编译为WASM 字节码并将其部署在官方Ewasm测试网上的工具。参与这次会议的结果是Second State将与以太坊基金会团队合作,为Solidity 和Vyper 语言构建下一代编译器工具链。 总体而言,Second State 上周非常成功的参与了Devcon5 和ETC 峰会。我们结交了新朋友,并建立了重要的伙伴关系。

October 14, 2019 · 1 min · jiezi

DOS-Network三月中四月项目月报

各位亲爱的DOS社区的支持者们,欢迎阅读3月20日至4月30日的月度项目进度报告!???? 请关注我们的微信公众号或加入DOS官方社群,了解DOS网络的最新动态,希望您喜欢!现在就为大家带来最新的项目进展月报! ⚙️ 产品和开发我们正在筹备即将发布的测试版。修复了节点cpu重载和内存不足的问题。从Kademlia DHT切换到Gossip SWIM进行网络路由,对p2p层进行了更多的模拟和测试。用Geth light节点代替full节点进行实验,进一步降低节点运行者的维护成本。为Docker和二进制部署开发了安装脚本。升级的系统合同,以支持Solidity 0.5.x。使用客户端看门狗watchdog和监护节点启动新一轮分布式随机生成,而不是空转和消耗gas。支持并行的预言机请求处理。实施监护人职能。 监护人就像MakerDao系统中的守护者一样,每个人都包括但不限于DOS客户端节点能够运行监护人脚本(待开发)并获得奖励。截至目前,监护人功能仅整合到客户端节点中。最终的引导过程和实现commit-reveal机制,用于安全地生成创世纪随机数。最简单的权益质押合约开发和测试网通证发行。系统合同gas优化和黑客攻击。Beta 1.0即将来临,敬请关注????????????! ????交易所列表,钱包和排名网站DOS通证目前在 4 个交易平台上有 8 个交易对,我们正在努力让DOS上更多主流的交易所。 BitMax 交易所: https://bitmax.io/#/trade/usd... https://bitmax.io/#/trade/btc... Bilaxy交易所: https://bilaxy.com/exchange#s... Coinsuper交易所: https://www.coinsuper.com/coi... https://www.coinsuper.com/coi... DDEX去中心化交易所: https://ddex.io/trade/DOS-WETH MXC交易所: https://www.mxc.com/trade.htm... https://www.mxc.com/trade.htm... DOS通证也可在Blockfolio,imToken、Trust Wallet和麦子钱包上查看和搜索: CoinMarketCap、CoinGecko和Binance Info现在也都在同步DOS Network项目信息和通证表现: DOS网络(DOS)价格,图表,市值和其他指标| CoinMarketCap https://coinmarketcap.com/cur... DOS网络(DOS)价格,市价,图表和基本面信息| CoinGecko https://www.coingecko.com/en/... DOS网络令牌(DOS)价格,评级,新闻和分析 -  Binance Info https://info.binance.com/en/c... 国内平台 MyToken、非小号、TokenClub、火星币优等也有同步DOS Network项目信息和通证表现。 ????新伙伴关系DOS Network已与QuarkChain达成战略合作伙伴关系。双方将为彼此提供更多用例,合作以满足全球商业标准,并促进分散应用的大规模采用。回顾:DOS与QuarkChain携手共进,为满足区块链全球化商业标准 DOS网络和原力协议正式建立了长期战略伙伴关系。双方将在分布式加密金融服务领域密切合作,实现更多区块链金融应用场景。回顾:DOS与原力协议齐心协力,拓展分布式加密金融领域 DOS网络已成为企业以太坊联盟(EEA)的成员,该联盟是全球最大的开源区块链组织,拥有300多家成员公司。我们很高兴加入欧洲经济区,为其使命做出贡献 - 增强基于以太坊的区块链技术的隐私性,安全性和可扩展性。回顾:DOS Network正式加入企业以太坊联盟(EEA) ???? 活动DOS网络成功地用BitMax进行了 1,000,000 DOS赏金计划。超过 5000 名用户参与了该计划,共有 397,326 个参赛作品。 DOS网络联合创始人兼运营负责人王琦,在Unitimes社区举办了AMA会议,该社区是全球领先的金融科技媒体平台。回顾:对话 DOS Network:我们不生产数据,我们只是数据的搬运工 | Unitimes AMA DOS网络提出了一种创新的令牌分发模型--DropBurn启动权益质押网络的新模型。我们希望分享和收集社区,感兴趣的开发人员,潜在的beta测试人员和节点运行者的反馈。 DOS Network的联合创始人华思远应邀参加芝加哥与BitMax,CTIA和Ankr Network的会面,讨论数字资产的现状和未来发展。华思远发表演讲,分享有关DropBurn的宝贵见解,并参与了一个小组讨论:区块链技术的转型角色。 ...

May 9, 2019 · 1 min · jiezi

Solidity-057简明教程

以太坊不仅是一种加密数字货币,它更是功能完备的智能合约平台,solidity就是用来开发以太坊上的智能合约的原生开发语言。solidity最早发布于2015年,它是第一种图灵完备的智能合约专用开发语言。目前除了以太坊之外,在其他区块链中也逐渐开始支持solidity,例如hyperledger fabric、tendermint等。在这个solidity快速教程中,我们将使用最新0.5.7版的solidity,以一个具体的案例来介绍solidity智能合约的开发、部署与交互,希望对你快速掌握solidity智能合约的开发有所帮助。 如果要高效系统地掌握以太坊智能合约与DApp的开发,推荐访问汇智网的在线互动课程:以太坊开发入门 | java以太坊 | python以太坊 | php以太坊 | C#以太坊 | 电商DApp实战 | ERC721通证实战 0、问题的背景有一个老爷爷,在生命的最后岁月别无他求,只是希望自己的财产能够通过遗嘱顺利地传给其他家庭成员。 在传统的遗嘱中,遗产分配方案是落实在法律文件上的,然后当真正开始分配时,法官需要重审文件并做出相应的决定。常见的问题发生在家庭成员之间对分配比例的争执上,甚至因此而导致家庭成员关系的破裂。在法庭听证阶段,这些都会影响法官最终的裁决,并因此可能导致不公平的结果,甚至对家庭关系造成进一步的伤害。 那么,如果我们可以让遗产分配自动进行,是否可以避免上述情况的发生? 如果遗产是一个智能合约,那么就不需要法官了。老爷爷可以自主地利用合约管理资产,然后在他去世后由程序来分配遗产给家庭成员。合约里的代码就决定了最终的分配结果,因此无需法官的介入。例如萨拉分$10000,本得到$5000,朱丽叶得到$2000。代码执行后,资产以代币或加密货币的形式自动分配给这些家庭成员,而无需人工介入。虽然不能保证每个成员都对遗产的分配结果满意,但是没有人会和代码争执。这听起来还比较可行,对吗? 记住这个案例,在这个快速教程中,我们将使用solidity,为老爷爷开发一个简单的遗嘱合约,来满足他最后的愿望。 1、搭建solidity开发环境开发solidity智能合约最简单的方法,就是使用官方提供的在线集成开发环境REMIX,你可以点击这里打开remix,在网页里就完成solidity智能合约的编写、编译与部署: 在你打开remix页面后,注意在右侧的run选项页,environment下拉框中,要选中JavaScript VM。这个选项的意思是使用一个内存仿真以太坊节点作为你的solidity智能合约的运行平台,这样就不用考虑与实际的以太坊主网交互所需要的账号、资金、计算费用等问题,而可以先把精力聚焦在学习如何使用solidity表达你的业务逻辑上。 点击remix页面左上方的+图标,就可以创建一个新的代码文件,我们将其命名为will.sol。在remix页面中间的编辑区域可以同时显示多个文件,当前正在编辑的文件,则以活动选项页的形式显示文件名称。 2、声明solidity编译器版本solidity还是很早期阶段的语言,从语法到编译器都在不断地演化,所以在solidity代码的第一行,一定要用pragma关键字声明这个文件中的solidity代码需要哪个版本的编译器。例如: 注意在solidity中,末尾的分号不可省略。 3、编写第一个solidity合约接下来就可以定义我们的第一个合约: 使用contract关键字来定义一个合约,solidity的合约类似于我们熟悉的OOP中的类,因此通常合约的名称首字母也会大写,例如Will。一对大括号用来定义合约的实现逻辑,单行注释也使用//,这和很多开发语言都类似。 4、solidity中的全局变量和构造函数在我们开始写代码之前,应当首先明确遗嘱的条款。假设老爷爷的遗产是50个以太币,其中20个留给他的儿子康莱德,剩下的30个留给他的妻子丽莎。在真实的环境中,当老爷爷去世后,应当有一个外部的程序将调用合约中定义的方法来分配遗产,但是我们为了便于学习将自己完成这个调用。 现在,让我们先完成如下代码: 表征合约所有者的变量表征遗产数量的变量表征老爷爷是否还健在的变量设置上述变量初始值的构造函数 第5行代码定义了合约的所有者。当我们在solidity中定义变量时,必须先声明其类型。address是solidity中一种特殊的类型,它表示一个以太坊地址。address类型的变量有一些特殊的方法,我们在后面会进一步了解。 第6行代码定义的fortune变量用来保存老爷爷的遗产数量,它的类型是uint或unsigned int,意思是这个变量是0或正整数。solidity中有很多数据类型,但我们不会在这里一一介绍,你可以在官方文档中深入了解solidity的数据类型。 第7行代码定义的isDeceased变量用来标识老爷爷是否已经去世,这是一个开关量,因此其类型为boolean,可能的值只有两个:true或false,默认值为false。 第9~13行代码是合约的构造函数,这个特殊的函数将在合约部署的时候自动执行。 public关键字被称为可见性修饰符,它的作用是声明被修饰的方法是否允许外部调用。public意味着在合约内部或外部(由其他合约或其他人)都可以调用该方法。 payable关键字是solidity的特色之一,它使得被修饰的方法可以发送或接收以太币。为构造函数声明payable关键字意味着当我们部署合约的时候,可以直接向合约存入以太币,例如,作为遗产的50个以太币。当合约接收到以太币后,这些币就保存在合约地址上了。 在构造函数内部,我们将owner变量的值设置为msg.sender,这是一个以太坊平台预置的全局变量,表示调用合约方法的账号地址,在我们的案例中,这的地址是老爷爷的。 同时我们将fortune变量的值设置为msg.value,这是另一个全局变量,它表示被调用的方法接收到的以太币的数量。 虽然变量isDeceased被自动初始化为默认值false,但为了清晰起见,我们将其显式地设置为false。 5、使用solidity修饰符在solidity中,修饰符(Modifier)可以为函数附加额外的条件逻辑。例如,假设我有一个用来关灯的方法,同时有一个修饰符要求灯开关必须处于on状态,那么我们就可以在方法上附加声明这个修饰符,以便确保只有在灯开关处于on状态时,才可以调用这个方法,否则就抛出异常。 第15行代码定义了onlyOwner修饰符。如果一个方法附加声明了这个修饰符,那么就要求调用方法的账号(msg.sender)必须与owner变量的值一致(别忘了我们在构造函数中设置了owner的值)。这个调用条件有助于遗产的分配,我们将在后面看到这一点。 require关键字的意思是,括号里的表达式的值必须为真(true),否则就会抛出异常,不再继续执行代码。 _;起到占位符的作用,在执行过程中,以太坊虚拟机会用被修饰的方法代码来替换它。 第20行代码定义了mustBeDeceased修饰符。如果一个方法附加声明了这个修饰符,那么就只有在isDeceased变量值为true时,才可以调用该方法,否则就抛出异常。 在上面的代码中,我们使用修饰符来限定方法的执行条件,当然也可以不使用修饰符,而直接在方法实现代码中使用require,不过修饰符看起来更高级一些,也更容易实现代码的复用。 6、设定遗产分配方案现在我们要继续完成遗产在家庭成员之间的分配任务,这需要他们的钱包地址和分配数量。 正如我们之前所述,康莱德将收到20个以太币而丽莎将继承30个。让我们创建一个数组来保存他们的钱包地址,然后写一个方法来分配遗产。 第25行代码定义了一个空数组familyWallets,用来保存所有家庭成员的钱包地址。和其他语言一样,在solidity中数组是顺序存放并且可以使用序号来存取。注意方括号之前的关键字paybale,只有address payable类型的变量,才可以接收以太币,这是0.5版本的solidity与之前版本的区别之一。 第27行代码创建了一个从address类型到uint类型的映射表变量inheritance,用来保存每个钱包地址的遗产数量。这是一个键/值对数据结构,类似于其他语言中的字典或哈希表,可以用键来存取值。 第29行代码定义了一个方法,它的功能是将一个钱包地址添加到familyWallets数组,然后设置该地址在inheritance映射表中的遗产数量。注意附加的onlyOwner修饰符,猜一下为什么我们要在这里声明这个修饰符? 第30行代码将传入方法的钱包地址追加到familyWallets数组的末尾。 第31行代码将传入方法的遗产继承数量设置为映射表inheritance的指定地址(传入方法的另一个参数)的值。 7、实现遗产自动分配让我们总结一下。到目前为止,我们已经学习了全局变量、数据类型、构造函数、特殊的关键字例如payable和public、内置的全局变量例如msg.sender和msg.value、修饰符和require、数组、映射表和方法。我们已经搭好了合约的框架,现在让我们把各部分整合起来最终完成合约。 作为这个教程最后一部分的代码,我们将实现家庭成员遗产的自动分配。 第34行定义了payout()方法,注意private关键字,这个可视性修饰符是public的反义词,它只允许被修饰的方法在合约内部调用,就像在第42行的代码那样。之所以在这里使用private,主要是考虑到安全性,因为我们不希望任何来自合约外部的调用。注意最后的mustBeDeceased修饰符,目前我们依然不能满足这个修饰符要求的条件来执行payout()方法。 第35行代码是一个for循环,用来遍历familyWallets数组。语法如下: 定义一个计数器变量i,声明循环的执行条件每个周期计数器变量i加1第36行代码是整个合约的核心,我们调用address类型的地址对象的transfer()方法,向该地址转账预定的遗产继承数量,inheritance[familyWallets[i]]表示在inheritance映射表中,键familyWallets[i]的值,也就是第i个家庭成员的遗产继承数量。 ...

April 29, 2019 · 1 min · jiezi

【solitidy】数学&hash&签名加密

solitidy官方文档数学函数addmod(uint x, uint y, uint k) returns (uint)计算(x + y) % k。加法支持任意的精度。但不超过(wrap around?)2**256。mulmod(uint x, uint y, uint k) returns (uint):计算(x y) % k。乘法支持任意精度,但不超过(wrap around?)2*256。hashkeccak256()SHA3采用Keccak算法,在很多场合下Keccak和SHA3是同义词,但在2015年8月SHA3最终完成标准化时,NIST调整了填充算法,标准的SHA3和原先的Keccak算法就有所区别了。在早期的Ethereum相关代码中,普遍使用SHA3代指Keccak256,为了避免和NIST标准的SHA3混淆,现在的代码直接使用Keccak256作为函数名。keccak256(…) returns (bytes32)// 紧密打包:参数不会补位,就直接连接在一起的。下面来看一个例子效果一样:keccak256(“ab”, “c”)keccak256(“abc”)keccak256(0x616263)keccak256(6382179)keccak256(97, 98, 99)sha256(…) returns (bytes32):使用SHA-256计算HASH值。紧密打包。sha3() 等于 keccak256()ripemd160(…) returns (bytes20)计算RIPEMD-160 hash。紧密打包。ecrecover()椭圆曲线加密引用pragma solidity ^0.4.4;contract Decode{ //公匙:0x60320b8a71bc314404ef7d194ad8cac0bee1e331 //sha3(msg): 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 (web3.sha3(“abc”);) //签名后的数据:0xf4128988cbe7df8315440adde412a8955f7f5ff9a5468a791433727f82717a6753bd71882079522207060b681fbd3f5623ee7ed66e33fc8e581f442acbcf6ab800 //验签数据入口函数 function decode() returns (address){ bytes memory signedString =hex"f4128988cbe7df8315440adde412a8955f7f5ff9a5468a791433727f82717a6753bd71882079522207060b681fbd3f5623ee7ed66e33fc8e581f442acbcf6ab800"; bytes32 r = bytesToBytes32(slice(signedString, 0, 32)); bytes32 s = bytesToBytes32(slice(signedString, 32, 32)); byte v = slice(signedString, 64, 1)[0]; return ecrecoverDecode(r, s, v); } //将原始数据按段切割出来指定长度 function slice(bytes memory data, uint start, uint len) returns (bytes){ bytes memory b = new bytes(len); for(uint i = 0; i < len; i++){ b[i] = data[i + start]; } return b; } //使用ecrecover恢复公匙 function ecrecoverDecode(bytes32 r, bytes32 s, byte v1) returns (address addr){ uint8 v = uint8(v1) + 27; addr = ecrecover(hex"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", v, r, s); } //bytes转换为bytes32 function bytesToBytes32(bytes memory source) returns (bytes32 result) { assembly { result := mload(add(source, 32)) } }}上述代码使用临时写的slice()函数把数据签名中的r,s,v切割出来;由于返回的仍是一个bytes类型,所以我们使用bytesToBytes32()进行一下类型转换8;另外需要注意的是ecrecoverDecode()根据前面的说明,我们需要对v值,加上27后再进行调用。最后调用decode()函数,我们将会得到公匙0x60320b8a71bc314404ef7d194ad8cac0bee1e331。bancor.network里面的验证算法function verifyTrustedSender(IERC20Token[] _path, uint256 _amount, uint256 _block, address _addr, uint8 _v, bytes32 _r, bytes32 _s) private returns(bool) { bytes32 hash = keccak256(_block, tx.gasprice, _addr, msg.sender, _amount, _path); // checking that it is the first conversion with the given signature // and that the current block number doesn’t exceeded the maximum block // number that’s allowed with the current signature require(!conversionHashes[hash] && block.number <= _block); // recovering the signing address and comparing it to the trusted signer // address that was set in the contract bytes32 prefixedHash = keccak256("\x19Ethereum Signed Message:\n32", hash); bool verified = ecrecover(prefixedHash, _v, _r, _s) == signerAddress; // if the signer is the trusted signer - mark the hash so that it can’t // be used multiple times if (verified) conversionHashes[hash] = true; return verified;} ...

January 8, 2019 · 2 min · jiezi

区块链智能合约入门:Hello world(1)

Hello world 是最简单的程序之一,也是大部分程序员编写的第一个程序。区块链入门也从最基础的Hello world智能合约开始。在正式部署执行Hello world智能合约之前,我们需要在电脑上安装MetaMask for CMT。这是一个安装在Chrome 浏览器的钱包工具,它的主要功能是管理 CyberMiles 帐号私钥,实现从网页上直接支付 CMTs (包括gas 费)等功能。安装过程比较简单,去Chrome 应用商店中下载插件MataMask for CMT,打开开发者模式。如果Chrome 浏览器中已经安装了其他版本的MetaMask,为了不影响使用,最好暂时停止使用其他版本的MetaMask,只留Metamask for CMT激活。安装好MetaMask for CMT,生成一个新的 CyberMiles 帐号来存储 CMTs,在最上方选择Main CyberMiles Network 或CMT Test Network。MetaMask 需要有真实的CMT或者test CMT来支付执行智能合约的gas 费,分别对应主链状态、测试链状态。CMT转账速度非常快,差不多10秒就到账了,并且不用支付gas费,转账体验+1分!在 Chrome 里打开Remix for CMT,将写好的Hello World智能合约代码放进中间的代码编辑区,当然,你也可以选择自己写代码。之后点击右侧的 Start to compile, 编译器会自动检查这段代码是否存在常规性错误。没有问题的话,编译器会自动识别出该段合约的名称,也就是 Contract 后面的Greet。如果有问题,编译器会给出提示,根据提示修改代码,再次编译即可。检查代码没有问题后,就可以把Greet智能合约部署到 CyberMiles 区块链了。点击右侧最上方的Run,然后点击Deploy。这时需要调用MetaMask for CMT 支付部署智能合约所需要的gas 费。一般情况下,MetaMask 的支付页面会自动跳出,点击 Submit 进行支付就可以了。如果没有自动跳出,手动点击插件就好了。可以看到,部署这个合约上链只需要花费0.000489个CMT。支付完gas 费后,右下方Deployed Contracts 处就可以看到,我们的合约已经在CyberMiles 链上部署好了。红色的terminate 可以终止这个合约,但只有合约owner 才可以执行这项操作,终止合约同样需要支持少量gas 费。greet 显示智能合约的内容是什么,在这里是Hello World。当然,Hello World 这个词只是程序员的选择。作为智能合约的开发者,你可以让 greet() 返回任何字符 — 可以是一首歌,一篇文章,一本书,或者是一段加密的文字。owner 显示这个合约的所有权归哪个地址所有。你为这个合约支付部署gas费的账号地址就是合约的所有者。同时用区块浏览器www.cmttracking.io/查询交易地址信息,可以看到刚刚创建的合约地址。如果你的朋友有这个合约地址,在 At Address 栏内输入合约地址,点击At Address 就可以收到别致的智能合约问候啦!我们上面知道怎么用Hello World智能合约在区块链存一段话,并让世界上任何人看见这段话。那么,这是怎么在代码里实现的呢?pragma lity ^1.2.4;这是智能合约所用的代码语言及版本。contract Greet { function greet() { } function terminate() { }}以上代码介绍了智能合约的名字Greet,以及两个功能,greet和terminate。address public owner; modifier onlyOwner() { assert(msg.sender == owner); _; } constructor () public { owner = msg.sender; }以上的代码设置了合约的owner,owner的地址信息是公开的。信息发送者,也就是谁支付了gas费,让合约能够部署到链上,谁就是owner,并且定义了只有owner能够修改这个合约。function greet() public pure returns (string) { return “Hello world”; }以上代码表明当你调用greet()时,就会出现 Hello World。这个功能只是从区块链上读取数据,所以不需要 gas 费用。这里你可以把 Hello World 改成任何文字。 function terminate() external onlyOwner { selfdestruct(owner); }这就是智能合约最开始定义的terminate 终止合约的功能,并且定义了只有Owner可以执行这项功能。selfdestruct是析构函数,用于销毁数据,终止合约。这个最基础的合约既设置了合约的Owner,同时也设置了Owner 能够销毁合约,当执行selfdesruct时,合约里的钱也会返还给Owner。因为合约地址与钱包地址长地非常像,并且长度也一致,如果不小心把币打到了合约地址,一般情况下,是无法找回的。但如果你知道合约的owner是谁,可以联系合约的owner,在销毁合约时拿回你的资产。这只是个人的小损失,如果项目方没有认真地对待代码,带来的资产损失是非常严重的。非常典型的案例是,今年7月份,Polkadot 有超过513,774.16 ETH 被冻结在Parity钱包中,就是因为合约中的 owner 被人设成 null 了,因此没有人可以终止合约,拿回存在合约里的钱。现在,钱仍然被锁在合约里,永久冻结。谨慎对待,认真审查每一段代码,尤其是涉及到钱的代码,这是每个程序员该有的素质。这是最简单最基础的Hello World,完整代码可去github查看。 ...

January 8, 2019 · 1 min · jiezi

【solitidy】bancor协议

https://www.jianshu.com/p/376…官网白皮书开源合约API介绍历史由来它是在1940年-1942年间由凯恩斯、舒马赫提出的一个超主权货币的概念,可作为一种账户单位用于国际贸易中,并由英国在二战后正式提出。然而,由于美国实力在二战后一枝独秀,Bancor 方案并没有在布雷顿森林会议上被采纳使用。但应用这一思想的 Bancor 算法则继续延续了其生命力。Bancor 算法由 Bancor Network 项目提出应用,旨在采用公式来设定好数字资产间的兑换价格。那么回到班柯算法,他的创作者是一群凯恩斯经济学的追随者。通过代码实现和升级了bancor的设计理念。他的最完美最终形态,是一种自动定价的一篮子货币。你随便给我一个币,然后我会根据我篮子里面你这种币的储备量给你定价卖bancor给你。然后因为篮子里的货币是铁索连舟连在一起的,并且是根据供需达成的人机交易公式定价,既没有利用竞价规则炒作的风险,也没有任何空手套白狼的做多做空工具,更没有任何被挪用的可能。具有非常牛逼的鲁棒性。基本概念connector token:用来做抵押发币使用,具有一定的价值,如:eth、btc。smart token:发出的新币,如erc20规范的代币。算法公式CW公式connector balance:连接器余额smart token total values:智能代币总余额价格公式connector balance:连接器余额Smart Token’s outstanding supply:智能token的供应量CW:connector weight,连接器比重智能代币买入token issued:应该获得的智能代币数量。connectd token paid:应该付出的连接代币的数量。智能代币卖出token destroyed:卖出的智能代币数量connected tokens paid out:应该收获的连接币数量。有效价格用A个connect token 转换成B个smart tokenconnected tokens exchanged:Asmart tokens exchange:B转换器两端token转换计算公式举个例子,现在将Atoken 转换成 BtokenfromConnectorWeight:Atoken的CWtoConnectorWeight:Btoken的CWfromConnectorBalance:Atoken的余额toConnectorBalance:Btoken的余额amount:使用amount个Atoken用来转成BtokentoAmount:能获取到的Btoken的数量疑惑?上面的公式都给出来了,按照智能代币买入公式,如果一开始supply = 10000,balance = 2500,cw = 0.5;用100个connector token买了198个smart token。那此时supply和balance的值应该变化成多少?通过计算验证得出:supply = 10000 + 198;balance = 2500 + 100;案例php的bancor计算公式public function buy(){ $supply = $this->get[“supply”]; $balance = $this->get[“balance”]; $paid = $this->get[“paid”]; $cw = 0.5; $token = $supply * (pow(1 + $paid / $balance, $cw) - 1); $price = $paid / $token; ApiFunc::api_export([ “token” =>$token, “priceBefore” => $balance / $supply / $cw, “priceEnd” => $price ]);}public function sell(){ $cw = 0.5; $supply = $this->get["supply"]; $balance = $this->get["balance"]; $token = $this->get["token"]; $paid = $balance * (1 - pow(1 - $token / $supply, 1 / $cw)); $price = $paid / $token; ApiFunc::api_export([ “paid” => $paid, “priceBefore” => $price, “priceEnd” => ($balance - $paid) / ($supply - $token) / $cw ]);}EOS RAM的Bancor算法RAM做了二重Bancor算法。第一重:以EOS为母币,Ramcore为衍生币;第二重:以RAM余量为母币,Ramcore为衍生币;bancor.networkBancorNetwork:BancorNetwork是bancor协议token转换的主要切入点。通过在单个事务中提供转换路径,运行在bancor网络中的任何token与其他token之间进行转换。BancorConverter,负责在token及其连接器直接进行转换。(中继代币)BancorFormula,不断重新计算价格,以保持tokens与连接器之间的余额。(自动定价) ...

January 7, 2019 · 1 min · jiezi

AlphaWallet 和 Nervos 签署备忘录正式建立深度合作伙伴关系

今天是 2019 年的第一天, AlphaWallet 和 Nervos 宣布正式建立深度合作,共同推动区块链技术的进一步发展,未来双方将在包括联合技术研发、品牌市场营销、海内外市场拓展等领域展开密切合作。AlphaWallet CEO 张中南表示,其实在 2018 年 7 月,双方已经建立了联系,初次会面双方就对彼此的产品和发展愿景留下了深刻印象。Nervos的分层架构和 Nervos CKB在底层公链上的技术创新展现出了及其雄厚的技术实力。Nervos 本身表现也非常卓越,令市场瞩目,是行业公认的技术领头羊,其远景和AlphaWallet有很多共识,产品上也有很多合作空间。Nervos CEO Terry Tai 同样表示:AlphaWallet 发布的 ERC 875 协议、 Attestation on Ethereum 协议可以看得出来团队技术实力和密码学功底非常扎实,四位联合创始人非常有趣,AlphaWallet 发布的俄罗斯世界杯区块链门票,是行业里广为人知的经典应用场景,跟 AlphaWallet 的合作是一件非常值得期待的事情。2018 年下半年双方共同在上海举办了 Nervos x AlphaWallet Meetup 闭门会议,聚集了行业内最有影响力的一批人,以及在布拉格举办 The Future of Layer 2 Meetup,对未来发展进行了深度的探讨。当前双方的联合市场研发的进展非常顺利,为彼此奠定了坚实的合作基础。这次双方正式建立合作关系,不仅直接巩固双方的紧密关系,也对未来的行业发展带来巨大的潜力和可能性:Nervos 致力于打造支持 Layer 2 的 Layer 1,而 AlphaWallet从应用角度出发 专注于 区块链应用运行平台和中间层协议的开发。双方通过技术协作和联合研发,推动资源互补,实现合作多赢。关于 AlphaWalletAlphaWallet 是 web3 世界的钱包引擎,是一个开源项目,通过构建协议和钱包平台帮助 DApp 实现功能和最佳的用户体验,同时支持 iOS 和 Android 两大平台。借助 AlphaWallet 提供的绝佳的易用性,可扩展性和隐私保障,轻松让用户获得完美使用体验。关于 NervosNervos Network 是以底层公链 Common Knowledge Base 作为核心的信任基础设施,承载各种网络上的可信组件。Nervos Common Knowledge Base(简称 Nervos CKB )是 Nervos 的 Layer 1 方案,为上层 Layer 2 提供信任基础。Nervos CKB 提出 Layer 1 for Layer 2 的理念,针对 Layer 2 解决方案进行了优化。AlphaWallet 官网:https://alphawallet.com电报群组 https://t.me/AlphaWalletGroupTwitter https://twitter.com/alpha_wallet ...

January 4, 2019 · 1 min · jiezi