【问题标题】:Where would a transaction take place in my Smart Contract我的智能合约将在哪里进行交易
【发布时间】:2019-01-10 19:48:36
【问题描述】:

我正在制作一个简单的智能合约,它本质上是一个账本,人们可以用一个字符串(即将到来的 UI)签名,然后传递给下一个人(使用他们的以太地址)。我只是想创造一些可以在记录旅程的同时在人与人之间传递的东西。

“转移”签名账本的逻辑都是在智能合约中完成的,它以 映射的形式存在,地址的键值从 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));   
    }
}

}

【问题讨论】:

    标签: blockchain ethereum solidity smartcontracts


    【解决方案1】:

    “转移”签名账本的逻辑都是在智能合约中完成的,它以映射的形式存在,地址的键值从 0 变为 1 表示所有权(一次拥有一个人)

    这是一种常见的模式,称为所有者模式。您可以通过简单地跟踪单个所有者地址并对其进行更新来简化此操作,而不是使用映射,因为您只关心当前所有者。像这样简单的事情:

    address public owner;
    
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
    constructor() {
        owner = msg.sender;
    }
    
    function transferOwnership(address _owner) onlyOwner {
        owner = _owner;
    }
    

    Open Zeppelin 拥有更完整的所有权实现here。

    因为没有实际的以太币/实际货币价值的转移,实际的以太币交易会在这个合约中发生在哪里?

    交易不需要以太币移动。您可以使用 0 值交易调用合约上的任何公共/外部函数,并将数据传递给它。交易将像任何其他交易一样在区块链上执行,并运行您在合约中调用的代码。

    还要对账本签名,我验证签名它的公钥在映射中的值是 1,但我如何检查该人是否拥有该公钥(使用私钥)?

    您已经在检查 msg.sender 是否与列入白名单的地址匹配。对于基本交易,这意味着该交易已经被msg.sender中的地址签名(msg.sender也可以是一个合约,如果另一个合约调用你的。在所有场景中要检查谁实际签署了交易,你必须使用@ 987654326@).

    【讨论】:

    • 好的,例如,如果 Dave 刚刚将所有权发送给 Bob 的以太坊公钥。因此,如果 Bob 想要签署然后将所有权转让给 Alice,他将如何在理论上的 UI 中做到这一点?我想我要问的是,一旦您访问 UI,是否会使用您的私钥进行某种形式的“登录”?或者前端如何知道 Bob 是签署/发送分类帐的人?
    • 如果我假设在 UI 中检查和验证 msg.sender,我是否需要自己编写代码,并为人们提供验证/签署交易的方法?
    • 最简单的方法是与 Metamask 之类的东西集成,然后将未签名的事务提供给适当的函数(web3 将让您构建它),并让 metamask 处理签名
    • 在这方面是否有关于“集成”元掩码和 web3 的文档或指南?我无法为项目的这一部分找到资源
    • Metamask 只是充当 web3 提供者,他们在这里有一些基本文档:github.com/MetaMask/faq/blob/master/DEVELOPERS.md 除此之外,web3 文档往往相当全面
    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多