鑄造智能公器意味著開發者接受價值證明的治理,拋棄資本主義生產方式。其中的重點為:
- 簽署許可將作品貢獻為人類的公共品。
- 在價值證明1.0中收獲去中心化估值市場的獎勵。
智能公器
智能公器(Smart Common)是指遵循 SCC0 許可協議、擁有自己的估值通證、能夠讓其開發者基於 PoV 價值證明獲得獎勵的智能創造公共物(包括dApp/dAIpp、AI或遊戲或其它開源軟件、EIPs、論文、技術標準等)。
道易程網站的菜單「智能公器」中提供了開發者Mint智能公器,並對其版本及其所獲獎金進行管理的入口。
{
{
string name; // Smart Common 名稱,唯一,不能與其它Smart Common同名.
string symbol; // Smart Common 通證名稱,唯一,不能與其它Smart Common通證同名
string desc; // Smart Common 描述
address manager; // Smart Common 管理員
uint16 version; // Smart Common 版本號,mint 時從1開始
string SC_Type // Smart Common 的類型
},
address[] calldata _members, //成員列表
uint16[] calldata _dividendRights, // 成員票權(分紅權),與_members 一一對應
uint16 _strategy, //提案投票通過率.百分之百(全票通過)是2的16次方減1(65535), 可以通過提案更改此值
uint32 _lifetime, //提案存活時間,以秒為單位,提案從創建開始計時,經過該時間後沒有完成的就作廢
uint32 _coolingPeriod // 提案冷卻時間,單位是秒,從提案創建開始計時,要經過該數值的時間後才能建新的提案.特別註意:冷卻時間必須大於存活時間
{
string filetype // logo 的後綴名, 只能是svg
string fileContent // svg 的純文本內容
}
}
如何在道易程上Mint一個智能公器
- dApp/dAIpp 類的智能公器只有智能合約的所有者(owner)才能 mint 智能公器,所以 mint 智能公器前,要先部署好裏面有 owner 信息的智能合約。
- Mint 智能公器的合約可以是某個 dApp/dAIpp 中的你指定的智能合約。需要特別註意的是,一個合約地址僅有權限創建一個智能公器。
- 非 dApp/dAIpp 類的智能公器不需要部署自己的合約。點擊「Mint 智能公器」後,直接按要求填寫好表單即可。以下兩篇文章是更具體的操作細節說明:
將 PoV 價值證明應用到所有開源軟件
將 PoV 價值證明應用到 EIPs、其它技術標準、科研論文等方面 - Mint 智能公器時,你還可以同時 Mint 任意套數的榮譽通證(一種紀念你的智能公器誕生的NFT)。所謂套數,是指其數量可以是你的智能公器分紅成員數的N倍。請註意你的智能合約裏,要事先寫好調用相關接口的合約代碼。
請註意:因以太坊gas非常昂貴,建議 logo 在2K以下,並且只能為 SVG 矢量圖形。
智能公器的合約示例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract ThreeDapp {
address public owner;
constructor(){
owner = tx.origin;
}
function ownerOf() public view returns(address){
return owner;
}
}
利用hardhat發布並 mint Smart Common 示例
const fs = require('fs')
const {ethers} = require('hardhat')
//通過以下腳本可以在道易程中創建智能公器
async function main() {
await hre.run('compile');
const[owner] = await ethers.getSigners();
// 下面腳本為mint dapp類型的智能公器示例
//你的dApp/dAIpp合約的名稱,通過該名稱加載你的合約並在以太坊上部署你的dApp/dAIpp。
const contractName = 'ThreeDapp';
//道易程智能公器註冊器的合約地址,mint智能公器的時候需要調用該地址進行註冊
const daismRegistrar_ = '0x3Bf70f9BfCfF20a90f0F36bAAF0d5afc3Ee232b7';
// 榮譽通證合約地址,在mint智能公器時mint榮譽通證需要調用
const daismHonorTokens_ = '0xC473f79875F202D15b128f2a40dff7e35B972Fc4';
//通過你的dapp合約的名稱進行加載並部署你的dapp合約
const dappContract = await daism_deploy(owner, contractName, [])
//下面為道易程智能公器註冊器合約的註冊方法的abi,腳本需要調用該註冊方法進行智能公器的mint操作.
let registerAbi = [{
"inputs": [{
"components": [{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "symbol",
"type": "string"
},
{
"internalType": "string",
"name": "desc",
"type": "string"
},
{
"internalType": "address",
"name": "manager",
"type": "address"
},
{
"internalType": "uint16",
"name": "version",
"type": "uint16"
},
{
"internalType": "string",
"name": "SCType",
"type": "string"
}],
"internalType": "struct SCInfo",
"name": "_SCInfo",
"type": "tuple"
},
{
"internalType": "address[]",
"name": "_members",
"type": "address[]"
},
{
"internalType": "uint16[]",
"name": "_dividendRights",
"type": "uint16[]"
},
{
"internalType": "uint16",
"name": "_strategy",
"type": "uint16"
},
{
"internalType": "uint32",
"name": "_lifetime",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "_coolingPeriod",
"type": "uint32"
},
{
"components": [{
"internalType": "string",
"name": "fileType",
"type": "string"
},
{
"internalType": "string",
"name": "fileContent",
"type": "string"
}],
"internalType": "struct File",
"name": "_logo",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "_data",
"type": "bytes"
}],
"name": "createSC",
"outputs": [{
"internalType": "uint256",
"name": "",
"type": "uint256"
}],
"stateMutability": "nonpayable",
"type": "function"
}]
// 加載道易程註冊器合約
const registerContract = new ethers.Contract(daismRegistrar_, registerAbi, owner)
//智能公器mint的參數(參數說明見上面的結構描述), 註:名稱和通證名稱 不允許重復
let SCinfo = ["scname5", "scsymbol5", "scdesc5", await dappContract.getAddress(), 1, 'dapp']
// mint dapp類型的智能公器
let res = await registerContract.createSC(
SCinfo,
[owner.address], //成員列表
[10], // 成員票權(分紅權)
(2 ** 16-1).toString(), //提案投票通過率,百分之分(全票)
7 * 24 * 3600, //壽命期為7天
9 * 24 * 3600, //冷卻期九天
[ 'svg', 'code of your SVG'], //Logo的svg代碼
'0x' //0x 表示不 mint 榮譽通證
)
console.log('createSC hash: ' + res.hash)
await res.wait()
console.log("createSC success")
//下面為EIP 類智能公器示例,同時 mint 榮譽通證。
let mintNum = 1 // 所要 mint 的榮譽通證的套數。
let abicoder = new ethers.AbiCoder()
//打包榮譽通證的owner列表及套數。
let functionData = abicoder.encode(['address[]', 'uint256'], [[owner.address], mintNum])
//打包榮譽通證合約地址及參數
let paras = abicoder.encode(["address", "bytes"], [daismHonorTokens_, functionData]);
//智能公器mint的參數(參數說明見上面的結構描述), 註:名稱和通證名稱 不允許重復
SCinfo = ["scname6", "scsymbol6", "scdesc6", await dappContract.getAddress(), 1, 'EIP']
//mint EIP類型的智能公器
res = await registerContract.createSC(
SCinfo,
[owner.address], //成員列表
[10], // 成員票權(分紅權)
(2 * *16 - 1).toString(), //提案投票通過率,百分之分(全票)
7 * 24 * 3600, //壽命期為7天
9 * 24 * 3600, //冷卻期九天
[ 'svg', 'code of your SVG'], //Logo的svg代碼
paras)
console.log('createSC hash: ' + res.hash)
await res.wait()
console.log("createSC succeeded")
console.log("--------------END--------------")
}
//部署合約的方法
async function daism_deploy(signer, contractName, paras = []) {
const factory = await ethers.getContractFactory(contractName, signer)
const product = await factory.deploy.apply(factory, paras)
await product.waitForDeployment()
const contract_address = await product.getAddress()
console.log('部署: ' + contractName + ' : ' + contract_address)
return await ethers.getContractAt(contractName, contract_address, signer)
}
main().then(() = >process.exit(0)).
catch((error) = >{
console.error(error);
process.exit(1);
});
網頁 Mint 智能公器示例
首先發布能夠調用 mint 智能公器的合約的智能合約(如你的dApp/dAIpp)。 並提取該智能合約或dApp/dAIpp的發布地址。
網頁上填寫相應信息並mint, 見下圖:
估值通證的命名
我們借鑒了Unix操作系統和Windows裏通用的方法(相關文檔可查閱微軟的「命名文件、路徑和命名空間」),即:- 智能公器的分類體現在估值通證的擴展名上。
- 估值通證的命名部分借鑒電腦操作系統的方法,即以「.」分成兩部分:
- 估值通證的命名規則,為「名稱.擴展名」。如:UL.eip(表明其智能公器是一個 EIP)。或者:ALOHA.ai(表明其為一個 AI 項目😂)。擴展名建議小寫,以使得前面的名稱更突出。任何人都可以任意設置其智能公器的擴展名——這是一種去中心化的命名規範。當然,如果其他人已經對某個分類做了沒有瑕疵的命名,那麽希望後面的開發者們能夠沿用。
- 為便於識別,前端會按照你輸入的大小寫顯示「.」之前的名稱。而之後的擴展名全部小寫。請註意「.」之前的名稱是不允許重復的,無論大小寫怎麽變化。
- 擴展名不可為空。
- 擴展名只增加,不刪除。
- 擴展名的修改,實際可能是新增,也可能是另選已經存在的另一個擴展名。
- 誰主張修改,誰遷移——如果某個智能公器的開發者決定修改其估值通證的擴展名,實際上是他新增了一個擴展名,或者是遷移到另一個已經存在的擴展名,然後他的智能公器就被劃分到新的分類裏。但原擴展名並沒有被刪除。這樣之前主動加入到原分類(原擴展名)裏的其它智能公器,就完全沒有受到影響。
- 擴展名的調整,要通過提案來表決。
- (前端)已經存在的擴展名,在用戶填寫時,自動成為可選項。一旦選擇,就會出現該擴展名的描述。這樣就能避免不同的分類使用同一擴展名。
- (前端)擴展名的命名是去中心化的,沒有限製。但考慮到越容易記住越好,還是要建議用戶盡量使用簡單易記的名稱,即盡量使用英文字母和數字來命名估值通證。一般不建議在文件名中包含特殊字符。