Example #1
0
    def sign_tx(self,
                tx: payloads.Transaction,
                password: str,
                magic: Optional[int] = None) -> None:
        """
        Helper function that signs the TX, adds the Witness and Sender

        Args:
            tx: transaction to sign
            password: the password to decrypt the private key for signing
            magic: the network magic

        Raises:
            ValueError: if transaction validation fails
        """
        if magic is None:
            magic = settings.network.magic

        self._validate_tx(tx)

        message = magic.to_bytes(4, byteorder="little",
                                 signed=False) + tx.hash().to_array()
        signature = self.sign(message, password)

        invocation_script = vm.ScriptBuilder().emit_push(signature).to_array()
        # mypy can't infer that the is_watchonly check ensures public_key has a value
        verification_script = contracts.Contract.create_signature_redeemscript(
            self.public_key)  # type: ignore
        tx.witnesses.insert(
            0, payloads.Witness(invocation_script, verification_script))
Example #2
0
 def _serializable_init(cls):
     return cls(0,
                types.UInt256.zero(),
                0,
                0,
                0,
                types.UInt160.zero(),
                payloads.Witness(b'', b''))
 def test_contract_is_standard_fail3(self):
     # test on witnesses of a transaction
     engine = test_engine(has_container=True, has_snapshot=True)
     witness = payloads.Witness(invocation_script=b'\x01',
                                verification_script=b'\x02')
     engine.script_container.witnesses = [witness]
     engine.push(vm.ByteStringStackItem(witness.script_hash().to_array()))
     engine.invoke_syscall_by_name("System.Contract.IsStandard")
     engine.execute()
     self.assertEqual(False, engine.result_stack.pop().to_boolean())
Example #4
0
 def __init__(self,
              version: int = 0,
              prev_hash: types.UInt256 = None,
              block_index: int = 0,
              validator_index: int = 0,
              data: bytes = None,
              witness: payloads.Witness = None):
     self.version = version
     self.prev_hash = prev_hash if prev_hash else types.UInt256.zero()
     self.block_index = block_index
     self.validator_index = validator_index
     self.data = data if data else b''
     self.witness = witness if witness else payloads.Witness()
Example #5
0
 def _create_genesis_block() -> payloads.Block:
     script = vm.ScriptBuilder().emit_syscall(
         contracts.syscall_name_to_int("Neo.Native.Deploy")).to_array()
     b = payloads.Block(
         version=0,
         prev_hash=types.UInt256.zero(),
         timestamp=int(
             datetime(2016, 7, 15, 15, 8, 21, 0, timezone.utc).timestamp() *
             1000),
         index=0,
         next_consensus=Blockchain.get_consensus_address(
             settings.standby_validators),
         witness=payloads.Witness(
             invocation_script=b'',
             verification_script=b'\x11'  # (OpCode.PUSH1)
         ),
         consensus_data=payloads.ConsensusData(primary_index=0,
                                               nonce=2083236893),
         transactions=[
             payloads.Transaction(
                 version=0,
                 script=script,
                 system_fee=0,
                 network_fee=0,
                 nonce=0,
                 valid_until_block=0,
                 signers=[
                     payloads.Signer(account=to_script_hash(b'\x11'),
                                     scope=payloads.WitnessScope.FEE_ONLY)
                 ],
                 witnesses=[
                     payloads.Witness(invocation_script=b'',
                                      verification_script=b'\x11')
                 ])
         ])
     return b
Example #6
0
def test_block(with_index=1) -> payloads.Block:
    tx = test_tx(with_index)
    header1 = payloads.Header(
        version=0,
        prev_hash=types.UInt256.from_string(
            "f782c7fbb2eef6afe629b96c0d53fb525eda64ce5345057caf975ac3c2b9ae0a"
        ),
        timestamp=123,
        index=with_index,
        primary_index=0,
        next_consensus=types.UInt160.from_string(
            "d7678dd97c000be3f33e9362e673101bac4ca654"),
        witness=payloads.Witness(invocation_script=b'',
                                 verification_script=b'\x55'))
    block1 = payloads.Block(header1, transactions=[tx])
    block1.rebuild_merkle_root()
    return block1
Example #7
0
    def __init__(self,
                 version: int = 0,
                 prev_hash: types.UInt256 = None,
                 merkle_root: types.UInt256 = None,
                 timestamp: int = 0,
                 index: int = 0,
                 next_consensus: types.UInt160 = None,
                 witness: payloads.Witness = None
                 ):

        self.version = version
        self.prev_hash = prev_hash if prev_hash else types.UInt256.zero()
        self.merkle_root = merkle_root if merkle_root else types.UInt256.zero()
        self.timestamp = timestamp
        self.index = index
        self.next_consensus = next_consensus if next_consensus else types.UInt160.zero()
        self.witness = witness if witness else payloads.Witness()
Example #8
0
 def _create_genesis_block() -> payloads.Block:
     h = payloads.Header(
         version=0,
         prev_hash=types.UInt256.zero(),
         timestamp=int(
             datetime(2016, 7, 15, 15, 8, 21, 0, timezone.utc).timestamp() *
             1000),
         index=0,
         primary_index=0,
         next_consensus=contracts.Contract.get_consensus_address(
             settings.standby_validators),
         witness=payloads.Witness(
             invocation_script=b'',
             verification_script=b'\x11'  # (OpCode.PUSH1)
         ),
     )
     return payloads.Block(header=h, transactions=[])
Example #9
0
    def sign_multisig_tx(self,
                         tx: payloads.Transaction,
                         password: str,
                         context: wallet.MultiSigContext,
                         magic: Optional[int] = None) -> None:
        if magic is None:
            magic = settings.network.magic

        if not self.contract:
            raise ValueError("Account is not a valid multi-signature account")

        # When importing a multi-sig account it searches for an associated regular account to copy key material from.
        # However, it is possible to add a multi-sig account before having a regular account with one of the required
        # public keys for the multi-sig account. Therefore, we should check if we actually have key material to continue
        if self.is_watchonly:
            _, _, public_keys = contracts.Contract.parse_as_multisig_contract(
                self.contract.script)
            raise ValueError(
                f"Cannot sign with watch only account. Try adding a regular account to your wallet "
                f"matching one of the following public keys, or update the key material for this account "
                f"directly."
                f" {list(map(lambda pk: str(pk), public_keys))}")

        self._validate_tx(tx)

        if not self.is_multisig:
            raise ValueError("Account is not a valid multi-signature account")

        if not context.initialised:
            context.process_contract(self.contract.script)

        if self.public_key not in context.expected_public_keys:
            raise ValueError(
                "Account is not in the required key list for this signing context"
            )

        message = magic.to_bytes(4, byteorder="little",
                                 signed=False) + tx.hash().to_array()
        signature = self.sign(message, password)

        context.signature_pairs.update({self.public_key: signature})

        if context.is_complete:
            # build and insert multisig witness
            sb = vm.ScriptBuilder()

            pairs = list(context.signature_pairs.items())
            # sort by public key
            pairs.sort(key=lambda p: p[0])

            for i, (key, sig) in enumerate(pairs):
                if i == context.signing_threshold:
                    break
                sb.emit_push(sig)

            invocation_script = sb.to_array()
            verification_script = contracts.Contract.create_multisig_redeemscript(
                context.signing_threshold, context.expected_public_keys)

            tx.witnesses.insert(
                0, payloads.Witness(invocation_script, verification_script))