合约 在solidity中的合约可以类比看做java等面向对象语言中的类。合约可以包含状态变量、函数、函数修饰符、事件、错误、结构体、枚举类型等等。 state variables // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.0 <0.9.0; contract SimpleStorage functions // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.1 <0.9.0; contract SimpleAuction function defined outside of a contract function helper(uint x) pure returns (uint) { return x * 2; Errors // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; /// Not enough funds for transfer
0 Solidity和智能合约Solidity开发可运行的智能合约步骤:源代码通过编译成字节码(Bytecode),同时会产生二进制接口规范(ABI)通过交易将字节码部署到以太坊网络,部署成功会产生一个智能合约账户通过 web3.js+ABI去调用智能合约中的函数来实现数据的读取和修改下面开始简单例子入手Solidity。 ), 57047)Ethereumjs-APIAccount class:私钥/公钥和地址相关功能 (创建、验证、转换)举例: Const generateAddress2generateAddress2 - 以太坊区块链的Delphi接口,允许开发适用于Windows,macOS,iOS和Android的dApp开发Fortmatic - 一种易于使用的SDK,无需扩展或下载即可构建web3 dAppPortis 0x67a3119994ffc7b384e086e443bf7a73a96a45c06ae3d1b163586ebc8e6f22"--unlock "0xac0603889ceee85ff0075de364d4fc92d383cecc57c2a2c3465404c8296feab15
开发/调试工具 与常规编程语言不同,Solidity 智能合约的开发往往无法直接通过一个 IDE 或本地环境进行方便的调试,而是需要与一个链上节点进行交互。 Truffle 是一个非常流行的 Javascript 的 Solidity 合约开发框架,提供了完整的开发、测试、调试工具链,可以与本地或远程网络进行交互。 Brownie。 除了开发框架外,更好地进行 Solidity 还需要熟悉一些工具: Remix IDE。 核心语法 经过上文,我们对 Solidity 的开发、调试与部署有了一定了解。接下来我们就具体学习一下 Solidity 的核心语法。 1 : 2; 循环 Solidity 使用 for、while、do while 关键字来实现循环逻辑,但是因为后两者容易达到 gas limit 边界值,所以基本上不用。
以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity。 如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战入门教程 以太坊去中心化电商应用开发实战 Solidity是一种语法类似JavaScript的高级语言 = x; } function get() constant returns (uint retVal) { return storedData; } } 在Solidity 免费电子书 如果你希望深入了解solidity的语言特性,可以下载我们制作的免费pdf电子书:Solidity官方文档中文版。
solidity任何类型都没有值为undefined或者null的情况。但是任何类型的数据在没有赋值之前,都会有一个该数据类型的对应的default value。 Fixed Point Numbers 固定小数位数的数据在solidity中并不完全支持,这种类型的数字可以被申明,但是不能被赋值或者计算得到。 (注意这里M表示的字节数是整个数字去掉小数点之后能表示的最大): MN的测试 fixed8x1 num = 12.7; // 必须一个小数,且最大为12.7 fixed8x0 num2 Bytes test function getByteLen() external pure returns (uint) { bytes2 b = '1'; return b.length; // 2 } function getByteValue() external pure returns (bytes1) { bytes2 b
译文出自:登链翻译计划[1] 译者:翻译小组[2] 开始在以太坊上编写智能合约 Solidity[3]是用于开发以太坊智能合约的最受欢迎的语言之一,因此,作为一个想要成为区块链开发人员的人,我决定学习如何使用 Solidity 开发智能合约。 设置开发环境 我们将使用的 IDE 是Remix[4],在浏览器输入Remix URL[5]。完成后,你应该会看到一个类似以下的界面: ? Remix 界面 在左侧,我选择了两个主要组件。 : https://github.com/lbc-team/Pioneer [2] 翻译小组: https://learnblockchain.cn/people/412 [3] Solidity: https /docs/solidity/layout-of-source-files.html [8] Solidity 源文件结构: https://learnblockchain.cn/docs/solidity
写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 本文前半部分是参考Solidity官方文档(当前最新版本:0.4.20 如下面的例子: address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2; nameReg.call("register", "MyName 所以开发者需要保证两个合约中的存储变量能兼容,来保证delegatecall()能顺利执行。 上面的这三个方法call(),delegatecall(),callcode()都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。 Address Literals) 一个能通过地址合法性检查(address checksum test)十六进制常量就会被认为是地址,如0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF
uint){ balance += amount; return (msg.sender, balance); } } 工欲善其事必先利其器,下面介绍开发的 Visual Studio 的 Solidity 插件,包含 Solidity 编译器。 Solidity 工具列表 Dapp Solidity 语言的构建工具、包管理器以及部署助手。 Solidity REPL 一个命令行控制台,可以让你立刻尝试 Solidity 语言。 第三方 Solidity 解析器和语法 solidity-parser JavaScript 的 Solidity 解析器 Solidity Grammar for ANTLR 4 ANTLR 4 解析器生成器的 Solidity 语法 我个人主要atom配合 Remix开发的,下面介绍一下Remix的使用 ##功能 这里我们使用在线编译器,打开网址 https://remix.ethereum.org/ [2018
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。 以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity。 Solidity的官方文档中文版 :https://pan.baidu.com/s/18yp9XjEqAHpiFm2ZSCygHw 5. 以太坊DApp开发环境搭建-windows :https://pan.baidu.com/s/1cyYkhIJIFuI2oyxM9Ut0eA 13. 以太坊DApp开发私链搭建-Ubuntu : https://pan.baidu.com/s/1aBOFZT2bCjD2o0EILBWs-g 14.
译文出自:登链翻译计划[1] 译者:翻译小组[2] 校对:Tiny 熊[3] 这是解构系列另一篇。如果你没有读过前面的文章[4],请先看一下。 这是 Solidity 生成的 EVM 代码, 在调用中总是在其他事情之前做的事情:在内存中保存一个位置以便以后使用。 让我们看看接下来会发生什么: 图 2. Calldata 长度检查。 如果你看一下 calldata,它现在是0x70a08231000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c。 我想这是 Solidity 使用的安全措施。 learnblockchain.cn/docs/solidity/contracts.html#fallback [16] Yul: https://solidity.readthedocs.io/en
address, uint){ balance += amount; return (msg.sender, balance); } } 工欲善其事必先利其器,下面介绍开发的 Solidity 工具列表 Dapp Solidity 语言的构建工具、包管理器以及部署助手。 Solidity REPL 一个命令行控制台,可以让你立刻尝试 Solidity 语言。 solgraph 可视化的 Solidity 控制流,并能标明潜在的安全漏洞。 第三方 Solidity 解析器和语法 solidity-parser JavaScript 的 Solidity 解析器 Solidity Grammar for ANTLR 4 ANTLR 4 解析器生成器的 Solidity 语法 我个人主要atom配合 Remix开发的,下面介绍一下Remix的使用 功能 这里我们使用在线编译器,打开网址 https://remix.ethereum.org
// bad uint x = 5 / 2; // Result is 2, all integer divison rounds DOWN to the nearest integer // good 当开发一个依赖随机数生成器的应用时,正确的顺序应当是(1)玩家提交行动计划,(2)生成随机数,(3)玩家支付。 // bad pragma solidity ^0.4.4; // good pragma solidity 0.4.4; (译者注:这当然也会付出兼容性的代价) 小心分母为零 (Solidity 当收到错误报告时,核心开发人员应该评估bug的严重性 在这个阶段的工作应该在私有仓库进行,并且在Github上的issue板块提出问题 如果这个bug需要被修复,开发人员应该在私有仓库编写测试用例来复现这个 solidity-coverage - Solidity代码覆盖率测试 Solgraph - 生成一个DOT图,显示了Solidity合约的功能控制流程,并highlight了潜在的安全漏洞。
2 Solidity语言特性Solidity语法接近js,一种面向对象的语言作为一种真正意义上运行在网络上的去中心合约,它又有很多不同:以太坊底层基于帐户,而非 UTXO,所以增加了一个特殊的address Funder(msg.sender, 1); bytes bytesValue = "a"; bytes1 bytes1Value = 0x1; uint8[3] nums = [1, 2, 3]; // dynamicNums 定义有误,因为声明了大小为1的数组,却试图初始化3个元素 // uint8[1] dynamicNums = [1, 2, 3]; // 这行代码是错误的 uint8[] dynamicNums = [1, 2, 3]; // 修正为数组动态大小 mapping (address => uint) myMapping; Remix非常强大,可直接在浏览器中使用,不用开发者自己搭建开发环境。
前言 经过了前几篇对智能合约基础、Web3.py、ethers.js 的学习,我们已经掌握了通过程序与区块链网络直接交互的基础知识,不熟悉的同学可以回顾一下: Solidity 智能合约开发 - 基础 Solidity 智能合约开发 - 玩转 Web3.py Solidity 智能合约开发 - 玩转 ethers.js 但是在真正的复杂业务场景中,我们往往会使用一些进一步封装的框架,如 HardHat ,提升开发效率。 优化代码格式化 VS Code 配置 我本地是通过 VS Code 进行代码开发的,可以通过安装 Solidity + Hardhat 与 Prettier 两个插件来进行代码格式化,可以使用打开 VS 安装 solidity-coverage 插件 我们通过 yarn add --dev solidity-coverage 命令来安装插件: 启用 solidity-coverage 支持 我们仅需在
简易版 NFT 合约代码pragma solidity ^0.8.4;import '@openzeppelin/contracts/token/ERC721/ERC721.sol';import '@ // 每个地址mint => 数量 mapping(address => uint256) public mintedWallets; // 构造函数,部署合约的时候,设置最大数量为2 constructor() payable ERC721('Simple Mint', 'SIMPLEMINT') { maxSupply = 2; } // 外部调用函数,开启
前言 在之前的《Solidity 智能合约开发 - 基础》中,我们学习了 Solidity 的基本语法,并且了解了可以通过 Brownie 与 HardHat 等框架进行调试。 而另一篇《Solidity 智能合约开发 - 玩转 Web3.py》中我们也通过 Web3.py 直接与我们本地的 Ganache 节点进行交互了。 原本因为之前比较熟悉 Python 的使用,所以想使用 Brownie 框架进行后续开发。 uint256 favoriteNumber; string name; } People public person = People({favoriteNumber: 2, 参考资料 Solidity 智能合约开发 - 基础 Solidity 智能合约开发 - 玩转 Web3.py Solidity, Blockchain, and Smart Contract - Javascript
// 0b00000010 return c; // 2 } } a << n 表示a的二进制位向左移动n位,在保证位数没有溢出的情况下等价于 a乘以2的n次方。 获取字符串长度 在 Solidity 中想获得字符串长度必须转成 bytes 类型然后使用 length 属性获得。 ) public pure returns (bytes2) { bytes9 _names = "netkiller"; return bytes2(_names); [3] T = [[1,2],[3,4],[5,6]]; pragma solidity ^0.4.20; //Author: netkiller <netkiller@msn.com> //Home: New=0, Pending=1, Done=2, Deleted=3 访问枚举方式 State.New 实际等于数字 0 pragma solidity ^0.4.20; //Author: netkiller
Solidity 合约不是 REST API —— 与它交互不是发个 HTTP 请求那么简单。 一、Solidity 不是 REST API 操作 REST 等价 Solidity 中的意义 读取数据 GET /resource } } 执行: # 配置私钥 $ export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 } } 执行命令: # 配置私钥 $ export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 2.
开发工具 简单起见,直接使用在线的remix ide,对应的网址为: https://remix.ethereum.org/ 进入之后选择solidity: 20.cnblogs.com/blog /922893/202201/922893-20220103174900574-1543754754.png) 选择solidity之后可以在左侧的菜单栏选择编译器的版本,开发语言,以及vm等,我这里的选择如下 : 开发与编译 选中左侧菜单栏的文件图标可以展示文件目录,选择contract目录,然后右键---》new file来新建你的智能合约: 选中对应的合约文件之后,点击compile图标,然后进行编译
import cv2 import numpy as np o1=cv2.imread('C:/Users/xpp/Desktop/Finger.png')#原始图像 o2=cv2.imread('C: /Users/xpp/Desktop/Finger.png',cv2.CV_8UC1)#原始图像 cv2.imshow("original",o1) gray=cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY hullArea=cv2.contourArea(hull)#计算凸包面积 Solidity=float(cntArea)/hullArea#计算Solidity print(Solidity) cv2 .imshow("result2",o1) cv2.waitKey() cv2.destroyAllWindows() 算法:Solidity是轮廓面积与凸包面积之比,作为图像、轮廓及凸包的特征 Solidity=轮廓面积 / 凸包面积 Solidity=float(cntArea)/hullArea cntArea表示轮廓面积 hullArea表示凸包面积 注意:轮廓就像从黑色背景中找到白色物体