by Rain Chu | 2 月 23, 2025 | AI, 程式開發
Views: 213
OpenRouter 是一個統一的大型語言模型(LLM)API 服務平台,可以讓使用者透過單一介面訪問多種大型語言模型。
主要特點:
- 多模型支援: OpenRouter 集成了多種預訓練模型,如 GPT-4、Gemini、Claude、DALL-E 等,按需求選擇適合的模型。
- 易於集成: 提供統一的 API 介面,方便與現有系統整合,無需自行部署和維護模型。
- 成本效益: 透過 API 調用,使用者無需購買昂貴的 GPU 伺服器,降低了硬體成本。
使用方法:
- 註冊帳號: 使用 Google 帳號即可快速註冊 OpenRouter。
- 選擇模型: 在平台上瀏覽並選擇適合的模型,部分模型提供免費使用。
- 調用 API: 使用統一的 API 介面,將選定的模型整合到您的應用中。
Cline 整合
OpenRouter 與 Cline 的整合為開發者提供了強大的 AI 編程體驗,Cline 是一款集成於 VSCode 的 AI 編程助手,支援多種大型語言模型(LLM),如 OpenAI、Anthropic、Mistral 等,透過 OpenRouter,Cline 能夠統一調用這些模型,簡化了不同模型之間的切換和管理,使用者只需在 Cline 的設定中選擇 OpenRouter 作為 API 提供者,並輸入相應的 API 金鑰,即可開始使用多種模型進行開發。這種整合不僅提升了開發效率,還降低了使用多模型的技術門檻。
DeepSeek R1
OpenRouter 現在也支援 DeepSeek R1 模型,DeepSeek R1 是一款高性能的開源 AI 推理模型,具有強大的數學、編程和自然語言推理能力。透過 OpenRouter,開發者可以在 Cline 中輕鬆調用 DeepSeek R1 模型,享受其強大的推理能力。這進一步豐富了開發者的工具選擇,讓他們能夠根據項目需求選擇最適合的模型。
by Rain Chu | 5 月 1, 2022 | 加密貨幣, 區塊鏈
Views: 72
之前推薦過一鍵發幣,那是懶人作法,適合快速且只想要簡單發幣的人,給點錢就能快速地解決問題,但真實的社會是不是這麼簡單的,真正的發幣行為應該是撰寫智能合約,通過第三方驗證,證明無漏洞後,並且發佈在區塊鏈上,聽起來很難,但看過這篇文章後,整個過程也是5分鐘內而已。
OpenZeppeLin 智能合約範本
首先要使用 OpenZeppeLin 來產生你發幣用智能合約,在 OpenZeppeLin 上面可以找到很多範本,可以直接引入即可,但更簡單的方法是使用 OpenZeppeLine精靈 來快速產生智能合約程式碼。
https://wizard.openzeppelin.com/
在這個畫面中如果要簡單發幣的話,可以填入 Name (代幣名稱), Symbol(代幣的代號), Premint (欲鑄的貨幣數量)的資料就可以了,常用的進階功能則有 Burnable, Votes, Pausable, 如果你是為了公司發行,可以在 Access Control 中選擇 Roles 然後建立自己的控制規則,可以多人控管開發行的貨幣
在 OpenZeppeLin 畫面上按下 Open in Remix 按鈕,就可以直接將合約範本直接帶入到 Remix 中
1.先連結你的 MetaMask 小狐狸錢包
2.選擇對應的編譯器,然後按下編譯,以本例是 0.8.4 版本的編譯器,Solidity 語法
3.將代幣發佈到區塊鏈上,環境選擇 Injected Web3, 並且注意你的 MetaMask 連結的網路是那哩,以我的圖片例子是選在 Ploygon 的測試鏈上,然後發佈的合約要選擇倒剛剛寫好的 ShaneToken, 設定無誤後按下 Deploy 即可發行
5.在 MetaMask 中確認合約正確性,注意發行到的網路是否正確,以及看一下 Gas Fee 多少錢,本例是發行在 Ploygon 上,所以使用的代幣是 MATIC ,自己的錢包有沒有對應的代幣可以支付,檢查完畢按下確認後就可以發行成功了
最後要將代幣匯入到 MetaMask 中
可以在 Polygonscan 中找到你得合約網址
將合約地址填回 MetaMask 就大功告成囉
可以在自己的錢包中看到自己發行的代幣,當個有錢人
延伸閱讀,利用 OpenZeppelin 來發NFT
https://www.frank.hk/blog/nft-smart-contract/
https://wizard.openzeppelin.com/#erc721
測試鏈做測試
測試時,需要去水龍頭那邊取得手續費用
常用測試鏈
SOL原始程式碼
如果不能用精靈產生程式碼,可以直接複製下面的程式碼
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
contract TestToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20SnapshotUpgradeable, OwnableUpgradeable, PausableUpgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize() initializer public {
__ERC20_init("Test Token", TST");
__ERC20Burnable_init();
__ERC20Snapshot_init();
__Ownable_init();
__Pausable_init();
__ERC20Permit_init("Shane Token");
__ERC20Votes_init();
__ERC20FlashMint_init();
_mint(msg.sender, 100000000 * 10 ** decimals());
}
function snapshot() public onlyOwner {
_snapshot();
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20Upgradeable, ERC20SnapshotUpgradeable)
{
super._beforeTokenTransfer(from, to, amount);
}
// The following functions are overrides required by Solidity.
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
super._burn(account, amount);
}
}
基本的發幣程式碼,支持可以維護以及可以銷毀
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/// @custom:security-contact
contract TestTokenMintableBurnable is ERC20, ERC20Burnable, Ownable {
constructor() ERC20("Test Token Mintable Burnable", "TTMB") {
_mint(msg.sender, 100000000 * 10 ** decimals());
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
發幣之後,驗證合約的安全性
發幣前後都要利用 CoinTool ,來驗證的你合約安全,才會讓大眾們信任
近期留言