鑄造智能公器意味著開發者接受價值證明的治理,拋棄資本主義生產方式。其中的重點為:

  1. 簽署許可將作品貢獻為人類的公共品。
  2. 在價值證明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裏通用的方法(相關文檔可查閱微軟的「命名文件、路徑和命名空間」),即:
  • 智能公器的分類體現在估值通證的擴展名上。
  • 估值通證的命名部分借鑒電腦操作系統的方法,即以「.」分成兩部分:
    1. 估值通證的命名規則,為「名稱.擴展名」。如:UL.eip(表明其智能公器是一個 EIP)。或者:ALOHA.ai(表明其為一個 AI 項目😂)。擴展名建議小寫,以使得前面的名稱更突出。任何人都可以任意設置其智能公器的擴展名——這是一種去中心化的命名規範。當然,如果其他人已經對某個分類做了沒有瑕疵的命名,那麽希望後面的開發者們能夠沿用。
    2. 為便於識別,前端會按照你輸入的大小寫顯示「.」之前的名稱。而之後的擴展名全部小寫。請註意「.」之前的名稱是不允許重復的,無論大小寫怎麽變化。
    3. 擴展名不可為空。
    4. 擴展名只增加,不刪除。
    5. 擴展名的修改,實際可能是新增,也可能是另選已經存在的另一個擴展名。
    6. 誰主張修改,誰遷移——如果某個智能公器的開發者決定修改其估值通證的擴展名,實際上是他新增了一個擴展名,或者是遷移到另一個已經存在的擴展名,然後他的智能公器就被劃分到新的分類裏。但原擴展名並沒有被刪除。這樣之前主動加入到原分類(原擴展名)裏的其它智能公器,就完全沒有受到影響。
    7. 擴展名的調整,要通過提案來表決。
    8. (前端)已經存在的擴展名,在用戶填寫時,自動成為可選項。一旦選擇,就會出現該擴展名的描述。這樣就能避免不同的分類使用同一擴展名。
    9. (前端)擴展名的命名是去中心化的,沒有限製。但考慮到越容易記住越好,還是要建議用戶盡量使用簡單易記的名稱,即盡量使用英文字母和數字來命名估值通證。一般不建議在文件名中包含特殊字符。