發佈 AZTEC 至 Ganache
本文為此系列文章的第二部分:
- AZTEC 協定簡介
- 發佈 AZTEC 至 Ganache (英文原文)
- 證明、簽收、及檢視金鑰管理
- 建立及使用加密資產
AZTEC 已發佈了相關合約至 Ropsten 和 Rinkeby 等測試鏈。合約的位址列在 NPM 套件 @aztec/contract-addresses
中。合約的文件則可參考 @aztec/contract-artifacts
。
然而對大部分開發情境而言,將合約發佈至 Ganache 較容易進行測試。流程也跟發佈至以太坊私鏈類似。
本篇文章的程式碼已上傳至 github 專案。裡面包含所需的套件跟設定。
- 下載專案至本機
git clone git@github.com:AztecProtocol/aztec-ganache-starter-kit.git
- 安裝套件
cd aztec-ganache-starter-kit && yarn install
- 複製環境檔
cp RENAME_ME.env .env
- 啟動 Ganache
yarn start
(同時會依 .env 裡的資料創立帳號) - 發佈 AZTEC!
yarn migrate
接下來讓我們細看這個專案做了什麼:
第 1 步
首先,我們需擁有合約原始檔以讓 Truffle 編譯。檔案已發佈至 NPM 套件@aztec/protocol
。
yarn add @aztec/protocol
第 2 步 — 發佈 ACE
const ACE = artifacts.require('./ACE.sol');
const AdjustSupply = artifacts.require('./AdjustSupply.sol');
const BilateralSwap = artifacts.require('./BilateralSwap.sol');
const DividendComputation = artifacts.require('./DividendComputation.sol');
const JoinSplit = artifacts.require('./JoinSplit.sol');
const PrivateRange = artifacts.require('./PrivateRange.sol');const utils = require('@aztec/dev-utils');const {
constants,
proofs: {
JOIN_SPLIT_PROOF,
MINT_PROOF,
BILATERAL_SWAP_PROOF,
DIVIDEND_PROOF,
PRIVATE_RANGE_PROOF,
},
} = utils;module.exports = async (deployer, network) => {
if (network === 'development') {
await deployer.deploy(ACE);
await deployer.deploy(AdjustSupply);
await deployer.deploy(BilateralSwap);
await deployer.deploy(DividendComputation);
await deployer.deploy(JoinSplit);
await deployer.deploy(PrivateRange); const aceContract = await ACE.deployed();
await aceContract.setCommonReferenceString(constants.CRS);
await aceContract.setProof(MINT_PROOF, AdjustSupply.address);
await aceContract.setProof(BILATERAL_SWAP_PROOF, BilateralSwap.address);
await aceContract.setProof(DIVIDEND_PROOF, DividendComputation.address);
await aceContract.setProof(JOIN_SPLIT_PROOF, JoinSplit.address);
await aceContract.setProof(PRIVATE_RANGE_PROOF, PrivateRange.address);
}
};
如第一篇文章提到的,AZTEC 有一套信賴建置系統來執行範圍證明運算。利用 ACE 的 setCommonReferenceString
方法可設定信賴建置系統的資料庫:
await aceContract.setCommonReferenceString(constants.CRS);
透過 ACE 的 setProof(proofId, address)
方法來設定各個執行證明的合約位址。proofId
為證明的類別,可從 NPM 套件 @aztec/dev-utils
裡取得定義:
const utils = require('@aztec/dev-utils');const {
proofs: {
JOIN_SPLIT_PROOF,
MINT_PROOF,
BILATERAL_SWAP_PROOF,
DIVIDEND_PROOF,
PRIVATE_RANGE_PROOF,
},
} = utils;
第二個參數則為已發布的合約位址:
await aceContract.setProof(MINT_PROOF, AdjustSupply.address);
await aceContract.setProof(BILATERAL_SWAP_PROOF, BilateralSwap.address);
await aceContract.setProof(DIVIDEND_PROOF, DividendComputation.address);
await aceContract.setProof(JOIN_SPLIT_PROOF, JoinSplit.address);
await aceContract.setProof(PRIVATE_RANGE_PROOF, PrivateRange.address);
第 3 步 — 發佈零知識資產 (ZKAsset)
當 ACE 及所需的證明合約都已發佈,我們就可以建立自己的零知識資產!
const ACE = artifacts.require('./ACE.sol');
const ZkAsset = artifacts.require('./ZkAsset.sol');
const ZkAssetMintable = artifacts.require('./ZkAssetMintable.sol');
const TestERC20 = artifacts.require('./TestERC20.sol');module.exports = async (deployer, network) => {
await deployer.deploy(TestERC20); if (network === 'development') {
const aceContract = await ACE.deployed(); // initialise the ZkAsset with an equivilant
await deployer.deploy(
ZkAsset,
aceContract.address,
TestERC20.address,
1,
false,
true
);
}
};
建立零知識資產需要 5 個參數:
aceAddress
— ACE 合約的位址linkedTokenAddress
— 零知識資產所代表的公開 ERC20 代幣合約位址,如不代表特定代幣則可設定為address(0)
scalingFactor
— 與代表的公開代幣間轉換的比例因數canAdjustSupply
— 布林值,如為真則表示合約擁有者可改變票據的總供給量canConvert
— 布林值,如為真則可轉換為所代表的公開代幣。零知識資產合約本身已內建類似於 ERC20 的confidentialTransfer
轉換機制。如需要更複雜的應用,可以解析證明的返回值,然後使用從當中獲取的資訊來更新相關票據在登記所裡的狀態。
最後,在專案目錄下執行 truffle migrate
。Truffle 會依上面兩個檔案發佈 ACE、各個證明合約、以及測試用的零知識資產合約到 Ganache 上。
這是系列文章的第二部分。下一篇:證明、簽收、及檢視金鑰管理。