铸造智能公器意味着开发者接受价值证明的治理,抛弃资本主义生产方式。其中的重点为:
- 签署许可将作品贡献为人类的公共品。
- 在价值证明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里通用的方法(相关文档可查阅微软的“命名文件、路径和命名空间”),即:- 智能公器的分类体现在估值通证的扩展名上。
- 估值通证的命名部分借鉴电脑操作系统的方法,即以”.“分成两部分:
- 估值通证的命名规则,为”XXXX.扩展名“。如:UL.eip(表明其智能公器是一个 EIP)。或者:ALOHA.ai(表明其为一个 AI 项目😂)。扩展名建议小写,以使得前面的名称更突出。任何人都可以任意设置其智能公器的扩展名——这是一种去中心化的命名规范。当然,如果其他人已经对某个分类做了没有瑕疵的命名,那么希望后面的开发者们能够沿用。
- 为便于识别,前端会按照你输入的大小写显示”.“之前的名称。而之后的扩展名全部小写。请注意”.“之前的名称是不允许重复的,无论大小写怎么变化。
- 扩展名不可为空。
- 扩展名只增加,不删除。
- 扩展名的修改,实际可能是新增,也可能是另选已经存在的另一个扩展名。
- 谁主张修改,谁迁移——如果某个智能公器的开发者决定修改其估值通证的扩展名,实际上是他新增了一个扩展名,或者是迁移到另一个已经存在的扩展名,然后他的智能公器就被划分到新的分类里。但原扩展名并没有被删除。这样之前主动加入到原分类(原扩展名)里的其它智能公器,就完全没有受到影响。
- 扩展名的调整,要通过提案来表决。
- (前端)已经存在的扩展名,在用户填写时,自动成为可选项。一旦选择,就会出现该扩展名的描述。这样就能避免不同的分类使用同一扩展名。
- (前端)扩展名的命名是去中心化的,没有限制。但考虑到越容易记住越好,还是要建议用户尽量使用简单易记的名称,即尽量使用英文字母和数字来命名估值通证。一般不建议在文件名中包含特殊字符。