我正在制作一个简单的智能合约,该合约本质上是一个分类帐,人们可以用字符串签名(UI来),然后传递给下一个人(使用其以太地址)。我只是想创建一个可以在记录旅程的过程中在人与人之间传递的东西。
“转移”签名分类帐的逻辑全部在智能合约中完成,它以 mapping 的形式存在,并且地址的键值从0变为1表示所有权(1一次拥有它的人)。因为没有以太币/实际货币价值的实际转移,该合约中实际的以太坊交易会在哪里发生?
还要对分类帐进行签名,我验证签名它的公钥在映射中的值为1,但是我将如何检查该人拥有该公钥(使用私钥)?
到目前为止我的固定代码:
pragma solidity ^0.4.4;
contract Pass{
mapping(address => bool) ownership;
mapping(address => string) notes;
constructor(address genesis) public {
ownership[genesis] = true; //this address starts with it
}
function checkOwnership(address p) public view returns(bool){
if(ownership[p]){
return true;
}
return false;
}
function sign(string signedNote) public returns(uint){ // 1 on success 0 on fail
if(checkOwnership(msg.sender)){ //if msg.sender owns the note
notes[msg.sender] = signedNote;
return 1;
}
return 0;
}
function pass(address recipient) public returns(uint){ // 1 on success 0 on fail
if(checkOwnership(msg.sender)){ //if msg.sender owns the note
ownership[msg.sender] = 0;
ownership[recipient] = 1;
return 1;
}
return 0;
}
function viewNotes(address participant) public returns(string){ // signed note on success nothing on fail
if(notes[participant] !== 0){
return (notes(participant));
}
}
}
答案 0 :(得分:0)
“转移”签名分类帐的逻辑全部在智能合约中完成,它作为映射存在,并且地址的键值从0变为1表示所有权(一次拥有1个人)
这是一个常见的模式,称为所有者模式。您只需跟踪单个所有者地址并更新它即可,而不用使用映射,因为您只关心当前所有者,因此可以简化此操作。就像这样简单:
address public owner;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
constructor() {
owner = msg.sender;
}
function transferOwnership(address _owner) onlyOwner {
owner = _owner;
}
开放式齐柏林飞艇拥有更完整的所有权实现here。
因为没有以太币/实际货币价值的实际转移,该合约中实际的以太坊交易会在哪里发生?
交易不需要以太币移动。您可以使用零值交易调用合同上的任何公共/外部函数,并将数据传递给该函数。交易将像其他任何交易一样在区块链上执行,并运行您在合同中调用的代码。
还要对分类帐进行签名,我验证签名它的公钥在映射中的值为1,但是我将如何检查该人拥有该公钥(使用私钥)?
您已经在检查msg.sender
是否与列入白名单的地址匹配。对于基本交易,这意味着该交易已通过msg.sender中的地址进行了签名(msg.sender
也可以是合同,如果另一个合同与您进行了联系。要在所有情况下检查是谁实际签署了该交易,则必须使用tx.origin
)。