Login
Discover
Waves
Communities
Login
Signup
lemooljiang
@lemooljiang
76
Designer , Poet , Technology enthusiasts
Followers
2368
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
3M
RE: Solidity开发指南
1.合约对象,2.继承,3.接口, 4.低级调用,call delegatecall 1. 合约对象 contract FuncAdd { uint x = 263; function add(uint x, uint y) external returns(uint) { return x; }; } contract TestAdd { //用合约地址来实例化接口 FuncAdd t =
$ 0.000
0
lemooljiang
starnote
3M
RE: Solidity开发指南
/* 增加的polygon充值方式 */ //polygon网络配置 const pol_url = " // const pol_url = " const abi = [ "event Transfer(address indexed from, address indexed to, uint value)", "function
$ 0.000
0
lemooljiang
starnote
3M
RE: Solidity开发指南
//contract event EventName(uint param); emit EventName(10); //js var e = contractInstance.EvevtName() e.watch(function(err, result) { if(!err){ console.log(result.args.name) } else { console.log(err) }
lemooljiang
starnote
3M
RE: Solidity开发指南
案例 最小化权限控制,尽量用external, private, internal, 尽量不用public 变量类型优先使用calldata而不是memory 加载状态变量到内存变量 多个条件判断使用短路方式 在循环中使用i,而不是i+=1,i 数组长度缓存到内存 缓存多次使用的数组元素到内存
lemooljiang
starnote
3M
RE: Solidity开发指南
为了一次性读取一个或多个合约的函数,快速得到结果。 主要是通到call 或 staticcall来读取合约数据。 calldata的计算: abi.encodeWithSignature("test1()"); 或是abi.encodeWithSelector(this.test1.selector); eg: targets.staticcall(calldata) targets:
lemooljiang
starnote
3M
RE: Solidity开发指南
教程 | 教程2 | 案例 可以使用assembly{}关键字开始编写Yul代码,它是一种简化且扩展了的汇编语言。通过使用assembly,我们可以直接访问堆栈,并优化代码以提高内存效率,从而减少执行交易所需的燃气量。这最终降低了用户的交易成本 contract StoringData { function setData(uint256 newValue) public { assembly {
lemooljiang
starnote
3M
RE: Solidity开发指南
参考 在可能的情况下,将ether发送给外部地址时使用transfer()函数,transfer()转账时只发送2300gas。payable(msg.sender).transfer(1 ether); 确保状态变量改变发生在ether被发送(或者任何外部调用)之前,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions); function
lemooljiang
starnote
3M
RE: Solidity开发指南
参考 发生场景: 以太坊转帐。 原因:发送的对象不知是外部帐户(用户地址)还是合约帐户。如果是合约帐户,则有被重入攻击的风险。 重入攻击发生在以太坊转帐的时候,msg.sender.call.value(_amount)(); 这条代码有重入风险。以太坊有两种帐户类型:一是外部帐户(用户地址),另一个是合约帐户
lemooljiang
starnote
3M
RE: Solidity开发指南
参考 struct Delegator { uint256 amount; uint256 rewardDebt; bool hasDeposited; string hiveAccount; } mapping(address => Delegator) public delegators; address[] public delegatorList; //一次获取所有的代理人 function
lemooljiang
starnote
3M
RE: Solidity开发指南
从智能合约中创建另一个智能合约,就像一个工厂批量制造出产品一样。工厂模式的想法是拥有一个合约(工厂),该合约将承担创建其他合约的任务。 工厂合约创建子合约有两种方法:new方法和create2方法。 计算合约地址 //使用new关键字来创建子合约 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract Child{ uint
lemooljiang
starnote
3M
RE: Solidity开发指南
如上图所示,用户D通过合约B调用合约接口来调用合约A中的函数,这时tx.origin的穿透性就体现出来了。msg.sender只能得到直接调用它的地址(即合约B),得不到用户D的身份,只有tx.origin才能得到!所以,从这里可能看到,tx.origin具有的穿透的访问性。
lemooljiang
starnote
3M
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
3M
RE: Solidity开发指南
参考 这两个函数主要和继承相关。父合约将被改写的函数加virtual,子合约中的改写函数加override。 默认情况下,函数不再是虚函数(virtual) 。 这意味着调用非虚拟函数将始终执行该函数,而不管它的继承层次结构的其他合约。这减少了在solidity 0.5 中存在的歧义,在solidity 0.5版本中的所有函数都是隐式虚函数,从而可以在继承结构中进一步重写。
lemooljiang
starnote
3M
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
3M
RE: Solidity开发指南
//v,s,r这三个参数是链下私钥签名签出来的, 这三个参数可以合成一个传给合约然后在合约里面做分割 function test(address owner, address sender, uint256 amount, bytes calldata sign) public { bytes32 digest =
lemooljiang
starnote
3M
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
3M
RE: Solidity开发指南
Application Binary Interface 应⽤程序⼆进制接⼝ 调⽤⼀个合约函数 = 向合约地址发送⼀个交易(交易的内容就是 ABI 编码数据) ⽤ABI编码传递数据给合约,因此与合约交互离不开ABI abi.encode(...) returns (bytes) : 计算参数的ABI编码 abi.encodePacked(...) returns (bytes) : 计算参数的紧密打包编码,不会补零
lemooljiang
starnote
3M
RE: Solidity开发指南
interface id是接口中所有函数选择器的异或值。 function getSelector() public pure returns (bytes32, bytes4, bytes4) { //addUser(string memory _name, uint8 _age) bytes32 hash; //hash =
lemooljiang
starnote
3M
RE: Solidity开发指南
接口有点类似抽象合约的功能,可用于两个合约间的调用。是非侵入式接口,也就是不用显式的调用接口。在ERC20合约中比较常见。 注意:B中引用A的接口,A的函数仍会在A的环境中执行。 一个合约想调用另一个合约的方法时,尽量用接口来调用,不要用call, delegatecall。 注意:两个合约间通过接口会相互改变状态变量。 // SPDX-License-Identifier: MIT pragma
lemooljiang
starnote
3M
RE: Solidity开发指南
抽象合约可以实现类似多态的功能。一个抽象合约被多个合约继承,对其方法可以有不同的实现,具体参看合约详情。 注意:两个合约间只是方法的实现,不会相互改变状态变量等。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; abstract contract AbstractContract { function add(uint m, uint
← Latest
Older →