Login
Discover
Waves
Communities
Raidstead
Write
Login
Signup
lemooljiang
@lemooljiang
76
Designer , Poet , Technology enthusiasts
Followers
2369
Following
95
Follow
Email digest
Resource Credits
Available
Used
Location
Guangzhou
Created
2016-07-16 04:39
RSS Feed
Subscribe
Comments
Blog
Posts
Comments
Communities
Wallet
lemooljiang
starnote
4M
RE: Solidity开发指南
哈希函数(散列函数):任意⻓度的输⼊,通过散列算法,变换成固定⻓度的输出 addmod(uint x, uint y, uint k) returns (uint): 计算 (x + y) % k,加法会在任意精度下执行,并且加法的结果即使超过 2**256 也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0 的校验(assert)。 mulmod(uint x, uint y,
$ 0.000
0
lemooljiang
starnote
4M
RE: Solidity开发指南
Application Binary Interface 应⽤程序⼆进制接⼝ 调⽤⼀个合约函数 = 向合约地址发送⼀个交易(交易的内容就是 ABI 编码数据) ⽤ABI编码传递数据给合约,因此与合约交互离不开ABI abi.encode(...) returns (bytes) : 计算参数的ABI编码 abi.encodePacked(...) returns (bytes) : 计算参数的紧密打包编码,不会补零
$ 0.000
0
lemooljiang
starnote
4M
RE: Solidity开发指南
interface id是接口中所有函数选择器的异或值。 function getSelector() public pure returns (bytes32, bytes4, bytes4) { //addUser(string memory _name, uint8 _age) bytes32 hash; //hash =
lemooljiang
starnote
4M
RE: Solidity开发指南
接口有点类似抽象合约的功能,可用于两个合约间的调用。是非侵入式接口,也就是不用显式的调用接口。在ERC20合约中比较常见。 注意:B中引用A的接口,A的函数仍会在A的环境中执行。 一个合约想调用另一个合约的方法时,尽量用接口来调用,不要用call, delegatecall。 注意:两个合约间通过接口会相互改变状态变量。 // SPDX-License-Identifier: MIT pragma
lemooljiang
starnote
4M
RE: Solidity开发指南
抽象合约可以实现类似多态的功能。一个抽象合约被多个合约继承,对其方法可以有不同的实现,具体参看合约详情。 注意:两个合约间只是方法的实现,不会相互改变状态变量等。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; abstract contract AbstractContract { function add(uint m, uint
lemooljiang
starnote
4M
RE: Solidity开发指南
calldata调用 EVM的函数选择原理 Low level interactions 一般是调用receive() 或 fallback() Low level interactions are used to send funds or calldata or funds & calldata to a contract through the receive() or fallback()
lemooljiang
starnote
4M
RE: Solidity开发指南
call 会切换到被调合约中去执行方法,会切换上下文。msg.sender是主调合约地址。 delegatecall 则是将被调合约中的方法调到本合约中执行,也就是不会切换上下文。msg.sender是发起者本人。 另外,还有staticcall是 call 的只读版本,适用于调用不会修改状态的函数。在调用期间,合约的状态无法被改变。 // SPDX-License-Identifier: MIT
lemooljiang
starnote
4M
RE: Solidity开发指南
lemooljiang
starnote
4M
RE: Solidity开发指南
标准的内容:名称,发行量,统一函数名,事件 参考 | 参考2 | erc20| erc20-5.0| erc20-old | OpenZeppelin cnpm install @openzeppelin/contracts --save // npm install @openzeppelin/contracts // SPDX-License-Identifier: MIT pragma solidity
lemooljiang
starnote
4M
RE: Solidity开发指南
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract SimpleStorage { uint storedData; event Set(uint value); // 事件是不需要实现的。 Circle c; // 自定义类型 struct Circle { uint radius; } // 定义一个函数修改器 modifier
lemooljiang
starnote
4M
RE: Solidity开发指南
版本申明 引用 合约主体 注释 // SPDX-License-Identifier: MIT //开源协议 pragma solidity ^0.8.20;//申明版本,最低0.8.20 /* * 这是注释段落 * */ import "./first_interface.sol"; //引用文件 contract SimpleStorage { //合约主体 uint storedData;
lemooljiang
starnote
4M
RE: Solidity开发指南
事件是合约外部通知,在logs中查看。一般用于dapp监听使用。 事件在合约中可被继承。当他们被调用时,会使参数被存储到交易的日志中 —— 一种区块链中的特殊数据结构。 成本较低 event Set(uint value); emit Set(x); //触发事件 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract EventTest
lemooljiang
starnote
4M
RE: Solidity开发指南
合约代码从区块链上移除的唯一方式是合约在合约地址上的执行自毁操作 selfdestruct 。合约账户上剩余的以太币会发送给指定的目标,然后其存储和代码从状态中被移除。移除一个合约听上去不错,但其实有潜在的危险,如果有人发送以太币到移除的合约,这些以太币将永远丢失。 尽管一个合约的代码中没有显式地调用 selfdestruct ,它仍然有可能通过 delegatecall 或 callcode 执行自毁操作。
lemooljiang
starnote
4M
RE: Solidity开发指南
delete操作符可以用于任何变量,将其设置成默认值。 删除字符串时,会将其值重置为空。 删除枚举类型时,会将其值重置为序号为0的值。 如果对动态数组使用delete,则删除所有元素,其长度变为0。 如果对静态数组使用delete,则重置所有索引。 如果对map类型使用delete,什么都不会发生。 如果对map类型中的一个键使用delete,则会删除与该键相关的值。 eg: uint256 public
lemooljiang
starnote
4M
RE: Solidity开发指南
error Myerror(address caller, uint i); function test(uint _i) public view { if(_i > 10) { revert Myerror(msg.sender, _i); } }
lemooljiang
starnote
4M
RE: Solidity开发指南
Assert, Require, Revert assert(bool condition) ⽤于判断内部错误,条件不满⾜时抛出异常.函数只能用于测试内部错误,并检查非变量。 用于pure函数,会对用户惩罚,扣光gas require(bool condition) require(bool condition, string message) //提供错误信息。
lemooljiang
starnote
4M
RE: Solidity开发指南
library, 标准的函数,可以反复使用。调用时类似delegatecall // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; library mathlib { function plus(uint a, uint b) public pure returns (uint) { uint c = a + b; assert(c>=a
lemooljiang
starnote
4M
RE: Solidity开发指南
import * as symbolName from "filename"; import "filename" as symbolName; 然后所有函数都以symbolName.symbol格式提供。 import 相当于接口,导入其它合约的函数,不过函数的执行环境不变,仍在原有合约中执行。例如:B中导入A,A.send()仍会在A的环境中执行。 import
lemooljiang
starnote
4M
RE: Solidity开发指南
参考 abi.encodeWithSignature(....)的前四个字节就是函数选择器,也就是msg.sig, 也可这这样计算 bytes4(keccak256(bytes(_func))) 这种方法可以直接调用合约的方法 eg: addr.call(abi.encodeWithSignature("transfer(address,uint256)", SomeAddress,
lemooljiang
starnote
4M
RE: Solidity开发指南
使用修饰器modifier可以轻松改变函数的行为。 例如,它们可以在执行函数之前自动检查某个条件。 contract owned { address owner; //修饰器所修饰的函数体会被插入到特殊符号 _; 的位置。 modifier onlyOwner { require( msg.sender == owner, "Only owner can call this function."
← Latest
Older →