搭建
hardhat
環(huán)境
- 全局安裝
solcjs
npm install -g solc
- 查看是否安裝成功
solcjs --version
輸出 0.8.21+commit.d9974bed.Emscripten.clang - 下載
remix
桌面版
https://github.com/ethereum/remix-desktop/releases
- 創(chuàng)建新文件夾并進入
-
npx hardhat
選擇ts創(chuàng)建項目 -
npm i -g hardhat-shorthand
安裝 縮寫和自動補全
hh
相當(dāng)于npx hardhat
-
ts
測試合約方法
const [owner, addr1] = await ethers.getSigners();
console.log('owner===',owner,addr1)
const testaa = await ethers.deployContract('Test')
await testaa.setOwner('0x70997970C51812dc3A010C7d01b50e0d17dc79C8')
const abc = await testaa.getOwner()
console.log('-=-=--=-',abc)
solidity 語法記錄
selfdestruct
https://www.alchemy.com/overviews/selfdestruct-solidity
修飾符
pure 對于函數(shù):不允許修改或訪問狀態(tài)。
view 對于函數(shù):不允許修改狀態(tài)。
payable 對于功能:允許他們在接到電話的同時接收乙醚。
constant 對于狀態(tài)變量:不允許賦值(初始化除外)肃拜,不占用存儲槽忽刽。
immutable 對于狀態(tài)變量:在構(gòu)造時只允許一個賦值璧亚,之后是常量。存儲在代碼中结闸。
anonymous 對于事件:不將事件簽名存儲為主題辩诞。
indexed 對于事件參數(shù):將參數(shù)存儲為主題坎弯。
virtual 對于函數(shù)和修飾符:允許在派生契約中更改函數(shù)或修飾符的行為。
library
https://www.geeksforgeeks.org/solidity-libraries/
通過創(chuàng)建庫來部署通用代碼可以降低gas成本
數(shù)據(jù)存儲 memory storage calldata
https://docs.alchemy.com/docs/when-to-use-storage-vs-memory-vs-calldata-in-solidity
https://docs.alchemy.com/docs/what-is-the-difference-between-memory-and-calldata-in-solidity
https://dev.to/ratracegrad/storage-vs-memory-vs-calldata-understanding-data-locations-in-solidity-52ff
msg.sender
https://medium.com/upstate-interactive/what-you-need-to-know-about-msg-global-variables-in-solidity-566f1e83cc69
錯誤處理assert revert require error
https://medium.com/blockchannel/the-use-of-revert-assert-and-require-in-solidity-and-the-new-revert-opcode-in-the-evm-1a3a7990e06e
函數(shù)修飾符 public external internal private
https://blockchain-academy.hs-mittweida.de/courses/solidity-coding-beginners-to-intermediate/lessons/solidity-5-calling-other-contracts-visibility-state-access/topic/visibility-public-private-external-internal/
自定義值類型
type UFixed256x18 is uint256;
// 用戶定義的值類型允許在基本值類型上創(chuàng)建零成本抽象。這類似于別名抠忘,但具有更嚴(yán)格的類型要求撩炊。
// 用戶定義的值類型使用 type C is V ,在哪里 C 是新引入的類型的名稱褐桌,并且 V 必須是內(nèi)置值類型(“基礎(chǔ)類型”)衰抑。
// 類型 C 沒有任何運算符或綁定的成員函數(shù)象迎。特別是荧嵌,即使是操作員 == 未定義。不允許與其他類型進行顯式和隱式轉(zhuǎn)換砾淌。
type UFixed256x18 is uint256;
// 該函數(shù) C.wrap 用于從基礎(chǔ)類型轉(zhuǎn)換為自定義類型啦撮。類似地,函數(shù) C.unwrap 用于從自定義類型轉(zhuǎn)換為基礎(chǔ)類型汪厨。
function add(UFixed256x18 a, UFixed256x18 b) internal pure returns (UFixed256x18) {
return UFixed256x18.wrap(UFixed256x18.unwrap(a) + UFixed256x18.unwrap(b));
}
創(chuàng)建外部合約對象
Test1 test1Contract = new Test1();
枚舉
enum ActionType { cancel, comfirm, sure, end }
結(jié)構(gòu)
struct UserInfo {
address addr;
uint256 balance;
bool isNote;
string name;
}
UserInfo userInfo = UserInfo({
addr:0xE4cdDab0Cf6d9Bf2231cd7CA3A8c82Ba24C74a1d,
balance: 1,
isNote:false,
name:"jack"
});
編譯器自動為所有 public 狀態(tài)變量 生成 getter 函數(shù)
// test1Contract.amount()
uint public amount;
映射
// 映射類型 映射的數(shù)據(jù)位置只能為 storage
mapping (address => uint256) public balanceInfo;
function updateBalance(address addr) public {
balanceInfo[addr] = uint256(100);
}
定義事件
// 定義事件赃春,alreadyEnd 調(diào)用后調(diào)用該事件
event SendParams(address owner, uint amount);
function alreadyEnd() public {
uint amounts;
// 在此處發(fā)送事件
emit SendParams(msg.sender, amounts);
}
try catch
// try 外部合約方法 catch
// 這個 try 關(guān)鍵字后面必須跟一個表示外部函數(shù)調(diào)用或協(xié)定創(chuàng)建的表達式 (new ContractName() ).
// 不會捕獲表達式內(nèi)部的錯誤(例如,如果它是一個復(fù)雜的表達式劫乱,同時還涉及內(nèi)部函數(shù)調(diào)用)织中,
// 只會在外部調(diào)用本身內(nèi)部發(fā)生還原。這個 returns 后面的部分(可選)聲明與外部調(diào)用返回的類型匹配的返回變量
try test1Contract.testFun() returns (uint) {
} catch {
}