以下是我們定義的資料結構:
我們將儲存兩個合作伙伴(partnerOne和partnerTwo)的地址。兩個布林標誌(signed和separated)將跟蹤夥伴關係的狀態。這兩個對映(具有hasSeparated和hasSigned)都將儲存合作伙伴關於其合夥關係或分離的批准。Item struct將幫助我們儲存要在合作伙伴之間共享的專案及其各自的份額百分比。Items陣列將儲存專案列表。ItemIds陣列將儲存專案的索引。
在確認區塊鏈上的各種交易時將觸發的事件
我們將在智慧合約部署期間(在建構函式中)初始化兩個使用者的錢包地址(一旦他們簽署合約,他們將來將成為合作伙伴)。我們還將使用諸如onlyPartner,isSigned和areNotSeparated之類的修飾符來限制各種智慧合約函式。
signContract方法將允許兩個使用者都簽署合約。雙方都簽署了合約後,智慧合約的狀態將變為合夥(透過將已簽名標記標記為true)。
注:可以從智慧合約external 呼叫指定為外部的方法。要在智慧合約內呼叫它,請使用this關鍵字(this.externalMethodName()),可以在智慧合約外部或內部呼叫指定為public的方法。Internal 方法只能在內部呼叫。Private 方法在衍生智慧合約中將不可用。
proposalItem將使兩個合作伙伴都可以提議要在它們之間共享的任何專案。只有在以下情況下,此交易才能成功:
· 兩個使用者都是合夥人(signed= true)。
· 每個合作伙伴的股份應為非負數,總股份總數應等於100%。
proposalItem方法還將標記已提議該專案的使用者批准的專案(item.hasApprovedAdd [msg.sender] = true)。然後將其儲存在items列表中,並將其索引保留在itemIds陣列中。
approveItem將接受一個itemId,以便從列表中確定要批准的專案。在發件人批准之前,它將驗證是否已新增,刪除或較早批准了該物品。一旦兩個夥伴都批准了該專案,則將其標記為已新增。
RemoveItem將接受itemId,以確定要刪除的專案。一旦雙方同意,該專案將被標記為已刪除。
Note- address.send()和address.transfer()方法是安全的,因為它們將23000gas轉發到外部呼叫,這僅足以記錄某些內容。而address.value.call(msg.value)()是不安全的,因為它將完整的氣體轉發給外部呼叫,使智慧合約容易受到駭客攻擊。
匿名付款方式將允許合作伙伴將資金儲存在智慧合約中。付款方式將使他們能夠將任何資金轉移給第三方。
注—匿名回退功能可能在其他任何功能之後被呼叫。如果必須僅將其用於事務處理(純以太坊傳輸),則應驗證msg.data.length == 0(最佳實踐)。
getSeparated允許兩個合夥人都申請終止合夥關係。如果雙方都同意分割,則合約將終止合夥關係。不允許他們在區塊鏈上進行任何其他交易。同樣,智慧合約中儲存的所有資金也將在其中平均分配。