copyrightcontractdemo
TRANSCRIPT
智慧合約應用於著作權
• 記錄著作權的 metadata (或 hash 值),不記錄完整的著作權• 交易流程均由合約(自動)強制執行,交易紀錄公開且完整
• 並非真的自動,仍需由外界啟動• 在合約之外的部分如法律訴訟、追討欠款等無強制力執行
三種類型 CONTRACT 簡介
CopyRightRecordMutisigVote CopyRight
主要的合約只有一份著作權的證明記錄每個交易合約的資訊
用於著作權擁有人投票的合約只有一份投票否決特定交易合約 etc.
交易合約和每個買家都建立一份記錄交易資訊
情況 1 開始交易
CopyRightRecord
CopyRightA
CopyRightB
CopyRightC
建立 copyright 合約
情況 1 開始交易
CopyRightRecord
CopyRightA
MutisigVote
呼叫
記錄更新資料
情況 1 開始交易
CopyRightRecord
CopyRightA
MutisigVote
呼叫
記錄更新資料
情況二 新夥伴
CopyRightRecordMutisigVote
著作權所有人
記錄更新資料
呼叫
情況三 收費
CopyRightRecordCopyRightA
著作權所有人著作權購買人
付款 呼叫合約
情況四 終止交易
CopyRightRecord CopyRightA
著作權所有人
中止交易
MutisigVote投票決定
呼叫
合約 code : https://github.com/NIC619/solPractice/blob/master/copyRight.sol
• Array in solidity : address[] owners;
• 類似固定陣列,但支援 push owners.push(address)
• delete : 將該位置的值變成 0 delete owners[2]
• 花 O(n) 維護 或著 每次都 loop 過包含被刪掉的整條陣列• public 屬性 :
• 一開始宣告的變數要加上 public 屬性才會顯示在 ABI ,才可以直接讀取其值uint public totalCount = 3;(in console) mycontract.totalCount(); //3
event
• return value 只有在• 1. 其他 function 會使用• 2. 在 console debug 時
• 才有用,否則是看不到回傳值的。那有些情況需要真的做出 transaction 並 broadcast 出去才能知道執行結果的該怎麼辦?• event
• 和 function 很像,但是只執行將傳入的參數寫入到鏈上的動作
event• event myrecord(address indexed _sender, uint indexed _amount, uint
indexed _currentTime)
function deposit() { … myrecord(msg.sender, msg.value, now);}
• 不可更改,永久記錄在鏈上• 有大小限制,超過會被丟 hash ,改存 hash 值• indexed 的屬性代表會被記錄在 logs 的 topics 裡,否則記錄在 data 裡
• 記錄在 topics 的值可以在 console 裡用 listerner 監聽, data 裡的無法• 最多三個
event• var myrecordEvent = myContract.myrecord({_sender:
someAddress});myrecordEvent.watch(function(err,result){ if(err){ console.log(err); return; } console.log(result.args._amount);})
console 指令• personal.unlockAccount(address)
• var xxxContract = eth.contract(ABI); // 建立 contract ABI
• var xxx = xxxContract.new(params,{from:address,data:’bytecode’,gas:gas_amount},function(err, contract){…}) // 部署 contract ,執行後會得到 Transaction hash 和 contract address
• miner.start() , miner.stop()
• var xxx = eth.contract(ABI).at(address)
• xxx.var1() // 在 console 顯示 var1 的值,前提是 var1 必須設為 public
• xxx.func1.call(params) // 本機跑 evm 模擬此 function 的執行,會顯示 function 裡的return value
• xxx.func1.sendTransaction(params, {from:address}) // 做成 transaction 並 broadcast
注意事項• 用 eth.getTransactionReceipt(“transaction hash”) 來得知
transaction 結果。如果有 error ,會發現 gas 全部都被吃掉;如果成功,會有 gasUsed 值顯示實際花了多少 gas 。• sendTransaction 的 gas 若不指定,則預設大約十萬左右,建議每次都設定一個夠大的數。 gas price 如果是 private net 則不必設定。• 小小心得: transaction broadcast 後如果沒成功執行,八成都是 gas不夠 ....... ,有時是網路延遲,可能 broadcast 出去但其他 peer 沒有收到,看一下 receipt 值,如果是 null 表示還沒完成。
合約各 function 的 Gas 花費• 建立 Copy Right Record 合約: 4992446
• 註冊新擁有權人: 123205
• 轉移擁有權: 112454
• 建立 Copy Right Contract 合約: 931138
• 計數 +1 : 26789
• 依計數付費: 43461
• 投票: 84963