本文使用區塊鏈平臺以太坊+智能合約實作一個區塊鏈記賬的功能,具體為:
- 借款人和貸款人以及數額被記錄在區塊鏈中,使用區塊鏈地址來表示借款人或者貸款人,
- 若一個借款人多次向一個貸款人借錢,更新所有的數額之和并記錄在區塊鏈中,
- 智能合約保存所有用戶的借貸資訊,包括他們的區塊鏈地址和數額
- 只有借款人才能向智能合約中添加借款記錄,
- 若一個人既是借款人,也是貸款人,那么最終下圖中的“Total Owed”只顯示他總的欠款,因此,如果他借出去的錢比借來的錢多,那么這個欄位為0,表示他不欠任何人錢,
- 一個UI界面方便用戶使用該應用,
除了智能合約部分的代碼邏輯,還需要實作后臺的UI和互動,這里使用JavaScript和html來實作,執行使用ganache在本地節點中來創建一個以太坊的測驗環境,先看最終的html頁面:

下面是執行環境安裝和完整的原始碼的地址,
執行環境搭建
- 下載安裝node.js (使用到了web3.js)
- 安裝ganache-cli (用來模擬以太坊的本地環境)
- 通過下面的鏈接進入remix 的IDE: https://remix.ethereum.org/
- 撰寫智能合約,具體的智能合約見文末;
- 在本地電腦中啟動ganache-cli,在cmd中輸入命令“ganache-cli”,回車即可,
- 為了部署寫好的智能合約,選擇下圖編號為1的選項,選擇web3 Provider;點擊Deploy按鈕就可以將編譯好的智能合約部署到本地的ganache-cli節點了,

- 點擊上圖編號3的圖示復制智能合約的地址,(粘貼)作為代碼script.js檔案的contractAddress變數的值,
- 使用瀏覽器打開index.html檔案,即可看到第一張圖效果,
需要注意的內容
這里的代碼只是一個demo,目的是演示一個全堆疊的以太坊智能合約應用,因此沒有優化性能,這里的性能主要指的是js代碼跟本地節點互動的成本,其次,為了減少智能合約的存盤和計算開銷,這里把大部分邏輯和存盤放到了本地的js代碼中,在目前的以太坊的mainnet中,交易費是很貴的,相比之下,js代碼和本地節點的互動反而是很便宜的,特別的,呼叫“只讀”的智能合約函式是不需要交易費的,因為這個程序只是js代碼和本地節點的互動,并沒有往區塊鏈中寫入或者修改區塊鏈的資料,因此,script.js中的函式“downloadAll()”是不需要手續費的,
完整的原始碼下載:
https://github.com/liangyihuai/LearnBlockchainByCoding
完整的智能合約代碼:
pragma solidity 0.6.6;
contract Splitwise{
struct CreditAcc{
address creditor; //the person who lends money
uint32 amount; //
}
//debtor address => creditor infor
mapping (address => CreditAcc[]) creditAccMap;
address[] users; //store all registered user's addresses.
function getUsers() public view returns(address[] memory){
return users;
}
//The debtor borrows money from the creditor
function lookup(address debtor, address creditor) public view returns (uint32 ret){
if(existCreditor(debtor, creditor)){
CreditAcc[] memory ca = creditAccMap[debtor];
for(uint i = 0; i < ca.length; i++){
if(ca[i].creditor == creditor){
return ca[i].amount;
}
}
}
return 0;
}
function add_IOU(address creditor, uint32 amount)public {
require(amount > 0);
require(msg.sender != creditor);
if(!existAnyCreditor(msg.sender)){
CreditAcc[] storage creditAccArray;
creditAccArray.push(CreditAcc(creditor, amount));
creditAccMap[msg.sender] = creditAccArray;
}else if(!existCreditor(msg.sender, creditor)){
creditAccMap[msg.sender].push(CreditAcc(creditor, amount));
}else {
CreditAcc[] storage caArr = creditAccMap[msg.sender];
for(uint i = 0; i < caArr.length; i++){
if(caArr[i].creditor == creditor)
caArr[i].amount += amount;
}
}
if(!existUser(creditor)) users.push(creditor);
if(!existUser(msg.sender)) users.push(msg.sender);
}
//----------------------------------------------------------
//helper functions
//----------------------------------------------------------
function existAnyCreditor(address debtor) private view returns(bool){
if(creditAccMap[debtor].length == 0) return false;
return true;
}
function existCreditor(address debtor, address creditor) private view returns(bool){
if(!existAnyCreditor(debtor)) return false;
CreditAcc[] memory caArr = creditAccMap[debtor];
for(uint i = 0; i < caArr.length; i++){
if(caArr[i].creditor == creditor)
return true;
}
return false;
}
function existUser(address u)private view returns(bool){
for(uint i = 0; i < users.length; i++){
if(users[i] == u) return true;
}
return false;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/278912.html
標籤:區塊鏈
下一篇:Secure8安裝程序
