Login
Discover
Waves
Communities
Login
Signup
lemooljiang
@lemooljiang
75
Designer , Poet , Technology enthusiasts
Followers
2368
Following
95
Follow
Resource Credits
Available
Used
Location
Guangzhou
Created
2016-07-16 04:39
RSS Feed
Subscribe
Comments
Blog
Posts
Comments
Communities
Wallet
lemooljiang
starnote
2026-05-25 10:34
RE: Solidity开发指南
为了一次性读取一个或多个合约的函数,快速得到结果。 主要是通到call 或 staticcall来读取合约数据。 calldata的计算: abi.encodeWithSignature("test1()"); 或是abi.encodeWithSelector(this.test1.selector); eg: targets.staticcall(calldata) targets:
$ 0.000
0
lemooljiang
starnote
2026-05-25 10:32
RE: Solidity开发指南
教程 | 教程2 | 案例 可以使用assembly{}关键字开始编写Yul代码,它是一种简化且扩展了的汇编语言。通过使用assembly,我们可以直接访问堆栈,并优化代码以提高内存效率,从而减少执行交易所需的燃气量。这最终降低了用户的交易成本 contract StoringData { function setData(uint256 newValue) public { assembly {
$ 0.000
0
lemooljiang
starnote
2026-05-25 10:29
RE: Solidity开发指南
参考 在可能的情况下,将ether发送给外部地址时使用transfer()函数,transfer()转账时只发送2300gas。payable(msg.sender).transfer(1 ether); 确保状态变量改变发生在ether被发送(或者任何外部调用)之前,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions); function
lemooljiang
starnote
2026-05-25 10:28
RE: Solidity开发指南
参考 发生场景: 以太坊转帐。 原因:发送的对象不知是外部帐户(用户地址)还是合约帐户。如果是合约帐户,则有被重入攻击的风险。 重入攻击发生在以太坊转帐的时候,msg.sender.call.value(_amount)(); 这条代码有重入风险。以太坊有两种帐户类型:一是外部帐户(用户地址),另一个是合约帐户
lemooljiang
starnote
2026-05-25 10:26
RE: Solidity开发指南
参考 struct Delegator { uint256 amount; uint256 rewardDebt; bool hasDeposited; string hiveAccount; } mapping(address => Delegator) public delegators; address[] public delegatorList; //一次获取所有的代理人 function
lemooljiang
starnote
2026-05-25 10:22
RE: Solidity开发指南
从智能合约中创建另一个智能合约,就像一个工厂批量制造出产品一样。工厂模式的想法是拥有一个合约(工厂),该合约将承担创建其他合约的任务。 工厂合约创建子合约有两种方法:new方法和create2方法。 计算合约地址 //使用new关键字来创建子合约 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract Child{ uint
lemooljiang
starnote
2026-05-25 03:40
RE: Solidity开发指南
如上图所示,用户D通过合约B调用合约接口来调用合约A中的函数,这时tx.origin的穿透性就体现出来了。msg.sender只能得到直接调用它的地址(即合约B),得不到用户D的身份,只有tx.origin才能得到!所以,从这里可能看到,tx.origin具有的穿透的访问性。
lemooljiang
starnote
2026-05-25 03:39
RE: Solidity开发指南
当使用super时,调用的是继承的函数,不是它自己,比如下边给出的例子中,函数名字是相同的,要知道调用的不是它自己,是继承父合约中的同名函数。 contract C { uint public u; function f() public virtual{ u = 1; } } contract B is C { function f() public override virtual{ u = 2;
lemooljiang
starnote
2026-05-25 03:38
RE: Solidity开发指南
参考 这两个函数主要和继承相关。父合约将被改写的函数加virtual,子合约中的改写函数加override。 默认情况下,函数不再是虚函数(virtual) 。 这意味着调用非虚拟函数将始终执行该函数,而不管它的继承层次结构的其他合约。这减少了在solidity 0.5 中存在的歧义,在solidity 0.5版本中的所有函数都是隐式虚函数,从而可以在继承结构中进一步重写。
lemooljiang
starnote
2026-05-25 03:36
RE: Solidity开发指南
在Solidity中是无法直接判断字符串相等的,可以通过哈希值是否相等来判断。 参考 //以字符串的哈希值来判断是否相等 function isEqual(string memory a, string memory b) public view returns (bool) { //return a == b; // hash(a) == hash(b) ==> a == b? bytes32
lemooljiang
starnote
2026-05-25 03:35
RE: Solidity开发指南
//v,s,r这三个参数是链下私钥签名签出来的, 这三个参数可以合成一个传给合约然后在合约里面做分割 function test(address owner, address sender, uint256 amount, bytes calldata sign) public { bytes32 digest =
lemooljiang
starnote
2026-05-25 03:35
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,
lemooljiang
starnote
2026-05-25 03:34
RE: Solidity开发指南
Application Binary Interface 应⽤程序⼆进制接⼝ 调⽤⼀个合约函数 = 向合约地址发送⼀个交易(交易的内容就是 ABI 编码数据) ⽤ABI编码传递数据给合约,因此与合约交互离不开ABI abi.encode(...) returns (bytes) : 计算参数的ABI编码 abi.encodePacked(...) returns (bytes) : 计算参数的紧密打包编码,不会补零
lemooljiang
starnote
2026-05-25 03:33
RE: Solidity开发指南
interface id是接口中所有函数选择器的异或值。 function getSelector() public pure returns (bytes32, bytes4, bytes4) { //addUser(string memory _name, uint8 _age) bytes32 hash; //hash =
lemooljiang
starnote
2026-05-25 03:31
RE: Solidity开发指南
接口有点类似抽象合约的功能,可用于两个合约间的调用。是非侵入式接口,也就是不用显式的调用接口。在ERC20合约中比较常见。 注意:B中引用A的接口,A的函数仍会在A的环境中执行。 一个合约想调用另一个合约的方法时,尽量用接口来调用,不要用call, delegatecall。 注意:两个合约间通过接口会相互改变状态变量。 // SPDX-License-Identifier: MIT pragma
lemooljiang
starnote
2026-05-25 03:27
RE: Solidity开发指南
抽象合约可以实现类似多态的功能。一个抽象合约被多个合约继承,对其方法可以有不同的实现,具体参看合约详情。 注意:两个合约间只是方法的实现,不会相互改变状态变量等。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; abstract contract AbstractContract { function add(uint m, uint
lemooljiang
starnote
2026-05-25 03:25
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
2026-05-25 03:24
RE: Solidity开发指南
call 会切换到被调合约中去执行方法,会切换上下文。msg.sender是主调合约地址。 delegatecall 则是将被调合约中的方法调到本合约中执行,也就是不会切换上下文。msg.sender是发起者本人。 另外,还有staticcall是 call 的只读版本,适用于调用不会修改状态的函数。在调用期间,合约的状态无法被改变。 // SPDX-License-Identifier: MIT
lemooljiang
starnote
2026-05-25 02:27
RE: Solidity开发指南
lemooljiang
starnote
2026-05-25 02:25
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
← Latest
Older →